strategy.js 1.6 KB

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