首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >passport-local with node-jwt-simple

passport-local with node-jwt-simple
EN

Stack Overflow用户
提问于 2013-11-27 05:43:33
回答 2查看 39.1K关注 0票数 90

如何组合passport-local以在身份验证成功时返回JWT令牌?

我想使用node-jwt-simple,但看着passport.js,我不知道该怎么做。

代码语言:javascript
复制
var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

是否可以在调用done()时返回令牌?就像这样..。(仅仅是伪代码)

代码语言:javascript
复制
if(User.validCredentials(username, password)) {
  var token = jwt.encode({username: username}, tokenSecret);
  done(null, {token : token}); //is this possible?
}

如果没有,如何返回令牌?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-29 05:02:47

我想通了!

首先,你需要实施正确的策略。在我的例子中是LocalStrategy,你需要提供你的验证逻辑。例如,sake,让我们使用passport-local中的那个。

代码语言:javascript
复制
var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

您提供的验证回调function(username, password, done)将负责查找您的用户并检查密码是否匹配(超出问题和我的答案的范围)

passport.js希望它能工作的几个部分,其中之一是您在策略中返回用户。我试着修改那部分代码,但那是错误的。如果验证失败,则回调将返回false,如果验证成功,则将返回object (已验证的用户)。

现在……如何集成JWT?

在您的登录路径中,您必须处理成功或失败的身份验证。在这里,您需要添加JWT令牌创建。如下所示:

(请记住禁用会话,否则您将不得不实现序列化和反序列化函数。如果你没有持久化会话,你就不需要它们,如果你使用基于令牌的身份验证,你就不需要了。)

来自本地passport示例:(添加了JWT令牌)

代码语言:javascript
复制
// POST /login
//   This is an alternative implementation that uses a custom callback to
//   achieve the same functionality.
app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err) }
    if (!user) {
      return res.json(401, { error: 'message' });
    }

    //user has authenticated correctly thus we create a JWT token 
    var token = jwt.encode({ username: 'somedata'}, tokenSecret);
    res.json({ token : token });

  })(req, res, next);
});

就是这样!现在,当您调用/login并发布用户名和密码(应该总是通过SSL)时,上面的第一个代码片段将尝试根据您提供的用户名查找用户,然后检查密码是否匹配(当然,您需要根据需要进行更改)。

之后,您的登录路由将被调用,您可以在那里处理返回错误或有效令牌的问题。

希望这能帮助到一些人。如果我犯了任何错误或忘记了什么,请让我知道。

票数 126
EN

Stack Overflow用户

发布于 2013-12-15 01:44:12

这里有一个我专门使用api令牌的样板(不使用sessions...not,会话当然不好;只是我们使用令牌方法):https://github.com/roblevintennis/passport-api-tokens

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20228572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档