소스 검색

Use siwe.

Jared Hanson 3 년 전
부모
커밋
738955a366
2개의 변경된 파일49개의 추가작업 그리고 4개의 파일을 삭제
  1. 46 1
      lib/strategy.js
  2. 3 3
      package.json

+ 46 - 1
lib/strategy.js

@@ -1,9 +1,17 @@
 var passport = require('passport-strategy')
+  , siwe = require('siwe')
   , util = require('util')
 
 function Strategy(options, verify) {
-  options = options || {};
+  if (typeof options == 'function') {
+    verify = options;
+    options = {};
+  }
+  if (!verify) { throw new TypeError('EthereumStrategy requires a verify function'); }
   
+  this.name = 'ethereum';
+  this._verify = verify;
+  this._passReqToCallback = options.passReqToCallback;
 }
 
 /**
@@ -13,6 +21,43 @@ util.inherits(Strategy, passport.Strategy);
 
 Strategy.prototype.authenticate = function(req, options) {
   console.log('ethereum authenticate...');
+  console.log(req.body);
+  
+  var message = req.body.message
+    , signature = req.body.signature;
+  
+  if (!message) { return this.fail({ message: 'Missing message' }, 400); }
+  if (!signature) { return this.fail({ message: 'Missing signature' }, 400); }
+  
+  var self = this;
+  
+  var siweMessage = new siwe.SiweMessage(message);
+  
+  siweMessage.validate(signature)
+    .then(function(message) {
+      console.log('valid!');
+      console.log(message);
+      
+      
+      function verified(err, user, info) {
+        if (err) { return self.error(err); }
+        if (!user) { return self.fail(info); }
+        self.success(user, info);
+      }
+      
+      try {
+        if (self._passReqToCallback) {
+          self._verify(req, message.address, verified);
+        } else {
+          self._verify(message.address, verified);
+        }
+      } catch (ex) {
+        return self.error(ex);
+      }
+    })
+    .catch(function(err) {
+      return self.fail({ message: 'Invalid signature' });
+    });
 };
 
 /**

+ 3 - 3
package.json

@@ -1,5 +1,5 @@
 {
-  "name": "passport-ethereum",
+  "name": "passport-ethereum-eip4361",
   "version": "0.1.1",
   "description": "Sign-In with Ethereum authentication strategy for Passport.",
   "keywords": [
@@ -31,8 +31,8 @@
   ],
   "main": "./lib",
   "dependencies": {
-    "oauth": "0.9.x",
-    "passport-strategy": "1.x.x"
+    "passport-strategy": "1.x.x",
+    "siwe": "^1.1.6"
   },
   "devDependencies": {
     "chai": "2.x.x",