【问题标题】:JSONWebTokens with express-jwt VS passport-jwtJSONWebTokens with express-jwt VS passport-jwt
【发布时间】:2015-12-07 00:11:49
【问题描述】:

express-jwt 包允许在登录时创建多个身份验证选项(即本地存储或社交媒体 OAuth 或 OpenID 提供程序等),然后使用 JWT 保护应用程序具有极大的灵活性。

特别是 express-jwt 配置,即

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

指路。

问题是:我想用来替代登录的许多网站都可以通过 passport.js 轻松访问。 Passport-jwt 似乎在后台使用了 jsonwebtokens.js 模块,所以有没有一种方法可以配置 passport-jwt,其灵活性与分别使用 jsonwebtokens.js 和 express-jwt.js 可以获得的灵活性相同?

【问题讨论】:

    标签: javascript authentication express passport.js


    【解决方案1】:

    是的,有。 Passport 有许多配置,它称之为策略。其中之一是passport-jwt:https://github.com/themikenicholson/passport-jwt

    这里有一个不错的指南,可以将它与 API 服务器一起使用:http://slatepeak.com/guides/building-a-software-as-a-service-saas-startup-pt-2/

    这是一个假设基本 express 应用配置的示例。

    // 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);
    

    回答您的问题 - 根据我的经验,是的,我认为它提供了很多灵活性,例如 express-jwt,甚至更多,并且也可以轻松地从您的主代码中抽象出来。

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 2016-10-23
      • 2019-06-30
      • 2017-01-26
      • 2016-04-24
      • 2018-05-07
      • 2016-04-04
      • 2017-03-04
      • 2017-01-12
      相关资源
      最近更新 更多