Created
November 7, 2013 17:16
-
-
Save monteslu/7358256 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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