Skip to content

Instantly share code, notes, and snippets.

@monteslu
Created November 7, 2013 17:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save monteslu/7358256 to your computer and use it in GitHub Desktop.
Save monteslu/7358256 to your computer and use it in GitHub Desktop.
define([
'server/promised/sessions',
'when',
'lodash',
'dojo/node!https',
'server/users/main',
'dojo/node!url'
], function(sessions, when, _, https, users, url){
var personaOptions = {
audience: "http://localhost:3000",
sessionKey: "email",
verifierURI: "https://verifier.login.persona.org/verify"
};
return {
init: function(options){
_.assign(personaOptions, options);
},
verify: function(assertion){
var deferred = when.defer();
var verifierOpts = url.parse(personaOptions.verifierURI);
verifierOpts.method = "POST";
verifierOpts.rejectUnauthorized = true;
verifierOpts.agent = new https.Agent(verifierOpts);
var self = this;
var vreq = https.request(verifierOpts, function(verifierRes) {
var body = "";
verifierRes.on("error", function(error) {
personaOpts.verifyResponse("Server-side exception", req, res);
});
verifierRes.on("data", function(chunk) {
body = body + chunk;
});
// Match the Persona Remote Verification API's return values
// https://developer.mozilla.org/en-US/docs/Persona/Remote_Verification_API#Return_values
verifierRes.on("end", function() {
var startTime = Date.now();
try {
var response = JSON.parse(body),
valid = response && response.status === "okay";
console.log('verifyRes body', Date.now() - startTime, response);
if (valid) {
var respObj = {email: response.email, status: "okay"};
console.log('self', self);
var session;
sessions.getSession(self.sessionId)
.then(function(storedSession){
session = storedSession;
session.email = response.email;
console.log('getting user',Date.now() - startTime, session.email);
return users.getUserByEmail(session.email);
}, function(err){
deferred.reject({email: response.email, status: "failure", reason: "no session"});
})
.then(function(savedUser){
console.log('got user data', savedUser);
session.user = savedUser;
respObj.user = savedUser;
deferred.resolve(respObj);
}, function(err){
console.log('no user for', session.email);
var userNameSuggestion = session.email.substring(0, session.email.indexOf('@'));
userNameSuggestion = userNameSuggestion.replace(/\W/g,'').toLowerCase();
users.getUserByUserName(userNameSuggestion)
.otherwise(function(errUserName){
respObj.userNameSuggestion = userNameSuggestion;
})
.ensure(function(){
console.log('ensure', respObj);
deferred.resolve(respObj);
});
})
.ensure(function(){
console.log('bensure', respObj);
//deferred.resolve(respObj);
sessions.set(self.sessionId, session);
});
} else {
deferred.reject({status: "failure", reason: response.reason});
}
} catch (e) {
console.log("Server-side exception", e);
deferred.reject({status: "failure", reason: e});
}
});
});
// SSL validation can fail, which will be thrown here
vreq.on("error", function(error) {
personaOpts.verifyResponse("Server-side exception", req, res);
});
vreq.setHeader("Content-Type", "application/json");
var data = JSON.stringify({
assertion: assertion,
audience: personaOptions.audience
});
//console.log('verify data', data);
vreq.setHeader("Content-Length", data.length);
vreq.end(data);
return deferred.promise;
},
logout: function(){
var self = this;
sessions.getSession(self.sessionId)
.then(function(session){
session.email = null;
sessions.set(self.sessionId, session);
console.log('update session - logging out', session);
},function(err){
console.log('no session found - logging out', self.sessionId);
});
return true;
}
};
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment