2015-09-10 20 views
5

Das Express-JWT-Paket ermöglicht eine enorme Flexibilität bei der Erstellung mehrerer Authentifizierungsoptionen beim Login (d. H. Lokaler Speicher oder Social Media OAuth oder OpenID-Anbieter usw.) und schützt die Anwendung dann mit JWT.JSONWebTokens mit Express-JWT VS Reisepass-JWT

Die Express-Konfiguration jwt insbesondere d.h.

app.use(expressJwt({ secret: jwtSecret}).unless({path:['/login']})); 

zeigt die Art und Weise.

Die Frage ist: Viele der Seiten, die ich für Login-Alternativen verwenden möchte, sind am einfachsten über pass.js erreichbar. Passport-jwt scheint das jsonwebtokens.js-Modul unter der Haube zu verwenden, gibt es also eine Möglichkeit, Passport-jwt mit derselben Flexibilität zu konfigurieren, die man mit jsonwebtokens.js und express-jwt.js individuell erreichen kann?

Antwort

2

Ja, gibt es. Passport hat viele Konfigurationen, was es Strategien nennt. Einer davon ist Pass-jwt: https://github.com/themikenicholson/passport-jwt

Hier ist eine anständige Führung es mit einem API-Server zu verwenden: http://slatepeak.com/guides/building-a-software-as-a-service-saas-startup-pt-2/

Hier ist ein Beispiel mit einem grundlegenden express app Config angenommen.

// init express app as normal.. 
var app = express(); 
// dependancies 
var passport = require('passport'); 
var jwt = require('jwt-simple'); 
var User = require('path/to/your/db/model'); // eg. mongo 
// initialize passport 
app.use(passport.initialize()); 
app.use(passport.session()); 
// configure passport jwt strategy 
var JwtStrategy = require('passport-jwt').Strategy; 
module.exports = function(passport) { 
    // JSON Web Token Strategy 
    passport.use(new JwtStrategy({ secretOrKey: 'secret' }, function(jwt_payload, done) { 
    User.findOne({id: jwt_payload.id}, function(err, user) { 
     if (err) return done(err, false); 
     if (user) done(null, user); 
     else done(null, false); 
     }); 
    })); 
}; 
// now have an authentication route 
app.post('/admin/authenticate', function(req, res) { 
    User.findOne({ 
    email: req.body.email 
    }, function(err, user) { 
    // create jwt token 
    var token = jwt.encode(user, 'secret'); 
    if (err) { 
     res.send({success: false, msg: 'error'}); 
    } else { 
     res.json({success: true, token: 'JWT ' + token}); 
    } 
    }); 
}); 
// finally require passport strategy to secure certain routes.. 
app.get('/admin/getsomedata', passport.authenticate('jwt', {session: false}), successFunction); 

Um Ihre Frage zu beantworten - in meiner Erfahrung ja ich denke, es viel Flexibilität wie Express-jwt bietet, wenn nicht mehr, und kann leicht auch von Ihrem Haupt Code abstrahiert werden.