Pārlūkot izejas kodu

Expose nonce store.

Jared Hanson 3 gadi atpakaļ
vecāks
revīzija
c6f637cab6
3 mainītis faili ar 50 papildinājumiem un 1 dzēšanām
  1. 2 0
      lib/index.js
  2. 46 0
      lib/store/session.js
  3. 2 1
      package.json

+ 2 - 0
lib/index.js

@@ -7,3 +7,5 @@ exports = module.exports = Strategy;
 
 // Exports.
 exports.Strategy = Strategy;
+
+exports.SessionNonceStore = require('./store/session');

+ 46 - 0
lib/store/session.js

@@ -0,0 +1,46 @@
+var crypto = require('crypto');
+var uid = require('uid2');
+
+
+function SessionStore(options) {
+  options = options || {};
+  this._key = options.key || 'ethereum';
+}
+
+SessionStore.prototype.challenge = function(req, cb) {
+  if (!req.session) { return cb(new Error('Ethereum authentication requires session support. Did you forget to use express-session middleware?')); }
+  
+  var self = this;
+  uid(16, function(err, nonce) {
+    if (err) { return cb(err); }
+    req.session[self._key] = {
+      nonce: nonce
+    };
+    return cb(null, nonce);
+  });
+}
+
+SessionStore.prototype.verify = function(req, nonce, cb) {
+  if (!req.session) { return cb(new Error('Ethereum authentication requires session support. Did you forget to use express-session middleware?')); }
+  
+  var self = this;
+  process.nextTick(function() {
+    var info = req.session[self._key];
+    delete req.session[self._key];
+    
+    if (!info) {
+      return cb(null, false, { message: 'Unable to verify nonce.' });
+    }
+    if (!info.nonce) {
+      return cb(null, false, { message: 'Unable to verify nonce.' });
+    }
+    
+    if (info.nonce !== nonce) {
+      return cb(null, false, { message: 'Invalid nonce.' });
+    }
+    return cb(null, true);
+  });
+}
+
+
+module.exports = SessionStore;

+ 2 - 1
package.json

@@ -32,7 +32,8 @@
   "main": "./lib",
   "dependencies": {
     "passport-strategy": "1.x.x",
-    "siwe": "^1.1.6"
+    "siwe": "^1.1.6",
+    "uid2": "^1.0.0"
   },
   "devDependencies": {
     "chai": "2.x.x",