session.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. var crypto = require('crypto');
  2. var randtoken = require('rand-token');
  3. function SessionStore(options) {
  4. options = options || {};
  5. this._key = options.key || 'ethereum:siwe';
  6. }
  7. SessionStore.prototype.challenge = function(req, cb) {
  8. if (!req.session) { return cb(new Error('Ethereum authentication requires session support. Did you forget to use express-session middleware?')); }
  9. var self = this;
  10. process.nextTick(function() {
  11. var nonce = randtoken.generate(16);
  12. req.session[self._key] = {
  13. nonce: nonce
  14. };
  15. return cb(null, nonce);
  16. });
  17. }
  18. SessionStore.prototype.verify = function(req, nonce, cb) {
  19. if (!req.session) { return cb(new Error('Ethereum authentication requires session support. Did you forget to use express-session middleware?')); }
  20. var self = this;
  21. process.nextTick(function() {
  22. var info = req.session[self._key];
  23. delete req.session[self._key];
  24. if (!info) {
  25. return cb(null, false, { message: 'Unable to verify nonce.' });
  26. }
  27. if (!info.nonce) {
  28. return cb(null, false, { message: 'Unable to verify nonce.' });
  29. }
  30. if (info.nonce !== nonce) {
  31. return cb(null, false, { message: 'Invalid nonce.' });
  32. }
  33. return cb(null, true);
  34. });
  35. }
  36. module.exports = SessionStore;