Based on http://backbonetutorials.com/cross-domain-sessions/
To run:
- brew install node
- npm install -d
- node server.js
Requests:
GET /session
POST /session
username: 'herp',
password: 'derp'
DELETE /session/:id
| *node_modules/ | |
| .DS_Store |
Based on http://backbonetutorials.com/cross-domain-sessions/
To run:
Requests:
GET /session
POST /session
username: 'herp',
password: 'derp'
DELETE /session/:id
| { | |
| "name": "cross-domain", | |
| "subdomain": "cross-domain", | |
| "scripts": { | |
| "start": "server.js" | |
| }, | |
| "version": "0.0.0-20", | |
| "engines": { | |
| "node": "0.6.x" | |
| }, | |
| "dependencies": { | |
| "express": "2.5.x", | |
| "connect": "2.2.x" | |
| } | |
| } |
| var express = require('express'); | |
| var connect = require('connect'); | |
| // Custom csrf library | |
| // var csrf = require('./csrf'); | |
| var app = express.createServer(); | |
| // An array of users who are already registered and can log in. | |
| var users = [ | |
| { username: 'herp', password: 'derp' }, | |
| { username: 'foo', password: 'bar' }, | |
| { username: 'turd', password: 'burgler' } | |
| ] | |
| var allowCrossDomain = function(req, res, next) { | |
| // Added other domains you want the server to give access to | |
| // WARNING - Be careful with what origins you give access to | |
| var allowedHost = [ | |
| 'http://backbonetutorials.com', | |
| 'http://localhost', | |
| 'http://localhost:4567', | |
| 'http://amoslanka.struck.com:4567', | |
| 'chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm' | |
| ]; | |
| // chrome-extension line is the origin header from POSTman chrome extension | |
| // console.log("Headers: ", req.headers, "\n") | |
| console.log("----------------------------") | |
| console.log("Origin: ", req.headers.origin) | |
| console.log("Session: ", req.session) | |
| if(allowedHost.indexOf(req.headers.origin) !== -1) { | |
| res.header('Access-Control-Allow-Credentials', true); | |
| res.header('Access-Control-Allow-Origin', req.headers.origin) | |
| res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); | |
| res.header('Access-Control-Allow-Headers', 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version'); | |
| next(); | |
| } else { | |
| console.log("Failed the CORS origin test: ", req.session.username) | |
| res.send(401, {auth: false}); | |
| } | |
| } | |
| app.configure(function() { | |
| app.use(express.cookieParser()); | |
| app.use(express.session({ secret: 'thomasdavislovessalmon' })); | |
| app.use(express.bodyParser()); | |
| app.use(allowCrossDomain); | |
| // app.use(csrf.check); | |
| }); | |
| app.get('/users/current', function(req, res){ | |
| console.log("GET users/current") | |
| // This checks the current users auth | |
| // It runs before Backbones router is started | |
| // we should return a csrf token for Backbone to use | |
| if(typeof req.session.username !== 'undefined'){ | |
| console.log("Verified logged in: ", req.session.username) | |
| res.send({auth: true, id: req.session.id, username: req.session.username}); | |
| // res.send({auth: true, id: req.session.id, username: req.session.username, _csrf: req.session._csrf}); | |
| } else { | |
| res.send(401, {auth: false}); | |
| // res.send(401, {auth: false, _csrf: req.session._csrf}); | |
| } | |
| }); | |
| app.post('/session', function(req, res){ | |
| console.log("POST session") | |
| // Login | |
| // Here you would pull down your user credentials and match them up | |
| // to the request | |
| var foundUser = undefined | |
| for (var i=0;i<users.length;i++) { | |
| var u = users[i]; | |
| if (u.username == req.body.username && u.password == req.body.password) { | |
| foundUser = u.username | |
| } | |
| } | |
| if (foundUser !== undefined) { | |
| req.session.username = req.body.username; | |
| console.log("Login succeeded: ", req.session.username) | |
| res.send({auth: true, id: req.session.id, username: req.session.username}); | |
| } else { | |
| console.log("Login failed: ", req.body.username) | |
| res.send(401, {status:401, message: {auth:false}}); | |
| } | |
| }); | |
| app.del('/session', function(req, res, next){ | |
| console.log("DELETE session") | |
| console.log("Logout: ", req.session.username) | |
| // Logout by clearing the session | |
| req.session.regenerate(function(err){ | |
| // Generate a new csrf token so the user can login again | |
| // This is pretty hacky, connect.csrf isn't built for rest | |
| // I will probably release a restful csrf module | |
| // csrf.generate(req, res, function () { | |
| res.send({auth: false, _csrf: req.session._csrf}); | |
| // }); | |
| }); | |
| }); | |
| console.log("Listening on port 8000...") | |
| app.listen(8000); |