diff --git a/jingo b/jingo index 5d3bc469..55237e2e 100755 --- a/jingo +++ b/jingo @@ -21,6 +21,7 @@ var express = require('express') , Url = require('url') , GoogleStrategy = require('passport-google').Strategy , LocalStrategy = require('passport-local').Strategy + , FacebookStrategy = require('passport-facebook').Strategy , yaml = require('yaml-js') , Flash = require('connect-flash') , program = require('commander'); @@ -97,11 +98,11 @@ if (!config.application || !config.server) { process.exit(-1); } -app.locals.authorization = config.authorization || { anonRead: false, validMatches: ".+" }; var auth = app.locals.authentication = config.authentication || { google: { enabled: true }, alone: { enabled: false } }; if ( (!auth.google || !auth.google.enabled) && - (!auth.alone || !auth.alone.enabled) ) { + (!auth.alone || !auth.alone.enabled) && + (!auth.facebook || !auth.facebook.appId || !auth.facebook.appSecret) ) { console.log("Error: no authentication method provided. Cannot continue."); process.exit(-1); } @@ -247,6 +248,20 @@ passport.use(new GoogleStrategy({ } )); +if (auth.facebook) { + passport.use(new FacebookStrategy({ + clientID: auth.facebook.appId, + clientSecret: auth.facebook.appSecret, + callbackURL: app.locals.baseUrl + '/auth/facebook/return', + profileFields: ['displayName', 'emails', 'id'] + }, + function(accessToken, refreshToken, profile, done) { + usedAuthentication("facebook"); + done(undefined, profile); + } + )); +} + passport.use(new LocalStrategy( function(username, password, done) { @@ -321,6 +336,10 @@ app.get ("/auth/google", passport.authenticate('google')); app.get ("/auth/google/return", passport.authenticate('google', { successRedirect: '/auth/done', failureRedirect: '/login' })); app.get ("/auth/done", routes.authDone); +app.get ("/auth/facebook", passport.authenticate('facebook', { scope: ['email'] })); +app.get ("/auth/facebook/return", passport.authenticate('facebook', { successRedirect: '/auth/done', failureRedirect: '/login' })); +app.get ("/auth/done", routes.authDone); + app.all('*', routes.error404); var listenAddr = process.env.NW_ADDR || ""; diff --git a/lib/tools.js b/lib/tools.js index e8071f45..9a6ba290 100644 --- a/lib/tools.js +++ b/lib/tools.js @@ -26,7 +26,7 @@ var tools = { return false; } - if (!pattern || pattern.trim() == "") { + if (!pattern) { return true; } @@ -34,7 +34,17 @@ var tools = { return false; } - var tests = pattern.split(",").map(function(str) { return str.trim(); }); + var tests; + if (pattern instanceof Array) { + tests = pattern; + } else if (typeof pattern == "string") { + tests = pattern.split(",").map(function(str) { return str.trim(); }); + } + + if (tests.length === 0) { + return true; + } + var expr; for (var i=0; i < tests.length; i++) { try { @@ -45,7 +55,6 @@ var tools = { } return expr; - }, hashify: function(str) { diff --git a/package.json b/package.json index 63b323bb..61526192 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "jade": "*", "passport": "*", "passport-google": "*", + "passport-facebook": "*", "passport-local": "*", "iconv": "*", "marked": ">= 0.2.x", diff --git a/views/layout.jade b/views/layout.jade index 2a245ada..e2f4852f 100644 --- a/views/layout.jade +++ b/views/layout.jade @@ -29,7 +29,9 @@ html a(id='login',href='/login?destination', title='Access login page') logged in else p.user - if user.email + if user.provider == 'facebook' + img(src="//graph.facebook.com/#{user.id}/picture?type=square", width=32) + else if user.email img(src=gravatar().url("#{user.email}", {s:24})) b  #{user.displayName}  a(href='/logout', title='Become anonymous') [Logout] diff --git a/views/login.jade b/views/login.jade index 3ad33084..aad92157 100644 --- a/views/login.jade +++ b/views/login.jade @@ -34,3 +34,9 @@ block content mixin saveAndCancel('Login') hr + + if (auth.facebook) + p + b Login using + a.btn.btn-primary(href="/auth/facebook") Facebook login + hr