strategy.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. var passport = require('passport-strategy')
  2. , siwe = require('siwe')
  3. , util = require('util')
  4. , SessionStore = require('./store/session');
  5. function Strategy(options, verify) {
  6. if (typeof options == 'function') {
  7. verify = options;
  8. options = {};
  9. }
  10. if (!verify) { throw new TypeError('EthereumStrategy requires a verify function'); }
  11. this.name = 'ethereum';
  12. this._verify = verify;
  13. this._passReqToCallback = options.passReqToCallback;
  14. this._store = options.store || new SessionStore();
  15. }
  16. /**
  17. * Inherit from `passport.Strategy`.
  18. */
  19. util.inherits(Strategy, passport.Strategy);
  20. Strategy.prototype.authenticate = function(req, options) {
  21. console.log('ethereum authenticate...');
  22. console.log(req.body);
  23. var message = req.body.message
  24. , signature = req.body.signature;
  25. if (!message) { return this.fail({ message: 'Missing message' }, 400); }
  26. if (!signature) { return this.fail({ message: 'Missing signature' }, 400); }
  27. var self = this;
  28. var siweMessage = new siwe.SiweMessage(message);
  29. this._store.verify(req, siweMessage.nonce, function(err, ok, info) {
  30. if (!ok) {
  31. return self.fail(info, 403);
  32. }
  33. siweMessage.validate(signature)
  34. .then(function(message) {
  35. console.log('valid!');
  36. console.log(message);
  37. function verified(err, user, info) {
  38. if (err) { return self.error(err); }
  39. if (!user) { return self.fail(info); }
  40. self.success(user, info);
  41. }
  42. try {
  43. if (self._passReqToCallback) {
  44. self._verify(req, message.address, verified);
  45. } else {
  46. self._verify(message.address, verified);
  47. }
  48. } catch (ex) {
  49. return self.error(ex);
  50. }
  51. })
  52. .catch(function(err) {
  53. return self.fail({ message: 'Invalid signature' });
  54. });
  55. });
  56. };
  57. /**
  58. * Expose `Strategy`.
  59. */
  60. module.exports = Strategy;