diff --git a/README.markdown b/README.markdown index efcc50e..9a25d14 100644 --- a/README.markdown +++ b/README.markdown @@ -4,7 +4,11 @@ The project goal is to provide simple SSO in node.js. ## Getting started -1. Clone the project: +1. get nodeSSO: + + npm install nodeSSO + + or `git clone git@github.com:adrai/nodeSSO.git` @@ -22,7 +26,8 @@ Using nodeSSO comes very easy to use with everyauth and express. 1. Create a sso juggler - var ssoJuggler = require('./nodeSSO/lib/ssoJuggler').createSSOJuggler({ + var SsoJuggler = require('nodeSSO'); + var ssoJuggler = new SsoJuggler({ authenticationPath: '/auth/openid?openid_identifier=https://www.google.com/accounts/o8/id' }); diff --git a/example/server.js b/example/server.js index 25c9c25..6f57922 100644 --- a/example/server.js +++ b/example/server.js @@ -1,9 +1,11 @@ +var SsoJuggler = require('../lib/ssoJuggler'); + var authPath= '/auth', deauthPath= '/deauth', successPath= '/success', validatePath= '/val'; -var ssoJuggler = require('../lib/ssoJuggler').createSSOJuggler({ +var ssoJuggler = new SsoJuggler({ authenticationPath: '/login', //authenticationPath: '/auth/openid?openid_identifier=https://www.google.com/accounts/o8/id', cookieExpirationTime: 20, @@ -11,7 +13,7 @@ var ssoJuggler = require('../lib/ssoJuggler').createSSOJuggler({ deauthPath: deauthPath, successPath: successPath, validatePath: validatePath - }); + }); var everyauth = require('everyauth'); @@ -20,15 +22,15 @@ everyauth .openid .myHostname('http://localhost:3001') .findOrCreateUser( function (session, userMetadata) { - - // Don't forget to save the userIdentifier! - ssoJuggler.saveUserIdentifier(session, userMetadata.email); - ssoJuggler.saveAuthSource(session, 'openId'); - - if (userMetadata.claimedIdentifier.indexOf('https://www.google.com/accounts/o8/id') == 0) { - ssoJuggler.saveAuthSource(session, 'google'); - } - + + // Don't forget to save the userIdentifier! + ssoJuggler.saveUserIdentifier(session, userMetadata.email); + ssoJuggler.saveAuthSource(session, 'openId'); + + if (userMetadata.claimedIdentifier.indexOf('https://www.google.com/accounts/o8/id') === 0) { + ssoJuggler.saveAuthSource(session, 'google'); + } + return userMetadata; }) .redirectPath(successPath); @@ -38,19 +40,19 @@ everyauth.password .postLoginPath('/login') // Uri path that your login form POSTs to .loginView("login.jade") .extractExtraRegistrationParams( function (req) { - return req; + return req; }) .authenticate( function (login, password, req) { - - console.log(login); - console.log(password); - console.log(req.param('remember') !== undefined); - - var errors = []; + + console.log(login); + console.log(password); + console.log(req.param('remember') !== undefined); + + var errors = []; if (!login) errors.push('Missing login'); if (!password) errors.push('Missing password'); if (errors.length) return errors; - var user = { login: 'user', password: 'password'} + var user = { login: 'user', password: 'password'}; if (!user) return ['Login failed']; if (user.password !== password) return ['Login failed']; @@ -78,7 +80,7 @@ var express = require('express'); //var RedisStore = require('connect-redis')(express); var app = express.createServer( express.bodyParser() - , express.static(__dirname + "/public") + , express.static(__dirname + '/public') , express.cookieParser() , express.session({ secret: 'htuayreve'/*, store: new RedisStore */}) , everyauth.middleware() @@ -89,33 +91,33 @@ ssoJuggler.addRoutes(app); var consumerToken = 'testToken'; app.get('/', function(req, res){ - res.writeHead(200, { 'Content-Type': 'text/html' }); - res.write('Login '+authPath+'?consumerToken='+consumerToken+'&callbackUrl=http://localhost:3001/validate'); - res.write('
'); - res.write('
'); - res.write('Logout '+deauthPath+'?callbackUrl=http://www.google.ch'); - res.end(); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.write('Login '+authPath+'?consumerToken='+consumerToken+'&callbackUrl=http://localhost:3001/validate'); + res.write('
'); + res.write('
'); + res.write('Logout '+deauthPath+'?callbackUrl=http://www.google.ch'); + res.end(); }); -app.get('/val', function(req, res){ - var userToken = req.param('userToken'); - res.redirect(validatePath+'?consumerToken=' + consumerToken + '&userToken=' + userToken + '&callbackUrl=http://localhost:3001/result'); +app.get('/validate', function(req, res){ + var userToken = req.param('userToken'); + res.redirect('/val?consumerToken=' + consumerToken + '&userToken=' + userToken + '&callbackUrl=http://localhost:3001/result'); }); app.get('/result', function(req, res){ - var userIdentifier = req.param('userIdentifier'); - var backConsumerToken = req.param('consumerToken'); - res.writeHead(200, { 'Content-Type': 'text/html' }); - if (backConsumerToken == consumerToken) { - if (userIdentifier) { - res.write('This is the user: '+userIdentifier); - } else { - res.write('User not valid'); - } - } else { - res.write('Wrong sender'); - } - res.end(); + var userIdentifier = req.param('userIdentifier'); + var backConsumerToken = req.param('consumerToken'); + res.writeHead(200, { 'Content-Type': 'text/html' }); + if (backConsumerToken == consumerToken) { + if (userIdentifier) { + res.write('This is the user: '+userIdentifier); + } else { + res.write('User not valid'); + } + } else { + res.write('Wrong sender'); + } + res.end(); }); everyauth.helpExpress(app); diff --git a/lib/ssoJuggler.js b/lib/ssoJuggler.js index 14cdf3a..38a9ff1 100644 --- a/lib/ssoJuggler.js +++ b/lib/ssoJuggler.js @@ -1,23 +1,7 @@ -var juggler - -if (typeof exports !== 'undefined') { - juggler = exports; -} else { - juggler = root.juggler = {}; -} - -juggler.VERSION = '0.0.1'; - -// Create new instance of juggler. -juggler.createSSOJuggler = function(options) { - return new Juggler(options); -}; - - /******************************************* * Juggler */ -Juggler = function(options) { +var Juggler = function(options) { var defaults = { authenticationPath: '/login', cookieExpirationTime: 60, @@ -47,7 +31,10 @@ Juggler.prototype = { addRoutes: function(app) { var checkTokenValidity = function(req, reqToken) { - var token = req.cookies.token != null ? JSON.parse(req.cookies.token) : null; + var token = null; + if (req.cookies.token) { + token = JSON.parse(req.cookies.token); + } if (token && reqToken == token.token) { return token; } @@ -56,7 +43,7 @@ Juggler.prototype = { var responseAuth = function(req, res, token) { - if (token != null) { + if (token) { if (!req.session.remember) { res.cookie('token', JSON.stringify(token), { maxAge: this.options.cookieExpirationTime*1000 }); @@ -79,14 +66,17 @@ Juggler.prototype = { var consumerToken = req.param('consumerToken'); var callbackUrl = req.param('callbackUrl'); - - var token = req.cookies.token != null ? JSON.parse(req.cookies.token) : null; + + var token = null; + if (req.cookies.token) { + token = JSON.parse(req.cookies.token); + } req.session.callbackUrl = callbackUrl; req.session.consumerToken = consumerToken; - if (token != null) { + if (token) { responseAuth(req, res, token); } else { res.redirect(this.options.authenticationPath); @@ -140,8 +130,10 @@ Juggler.prototype = { } }; +module.exports = Juggler; + // helper -var mergeOptions = function(options, defaultOptions) { +function mergeOptions(options, defaultOptions) { if (!options || typeof options === 'function') { return defaultOptions; } @@ -150,4 +142,4 @@ var mergeOptions = function(options, defaultOptions) { for (var attrname in defaultOptions) { merged[attrname] = defaultOptions[attrname]; } for (var attrname in options) { if (options[attrname]) merged[attrname] = options[attrname]; } return merged; -}; +} diff --git a/package.json b/package.json index 5ca461c..e270e0a 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,26 @@ { - "author": "adrai" + "author": "adrai" , "name": "nodeSSO" , "version": "0.0.1" , "private": false - , "main": "index.js" + , "repository": { + "type": "git" + , "url": "git@github.com:adrai/nodeSSO.git" + } + , "keywords": ["sso", "login", "web", "session", "cookie", "user"] + , "main": "./index.js" + , "directories": { + "lib": "./lib" + } , "engines": { - "node": "~v0.4.12" + "node": ">= v0.4.0" } , "dependencies": { - } + } , "devDependencies": { "express": ">=0.0.1" , "everyauth": ">=0.0.1" } - , "scripts": { - } + , "scripts" : { + } }