当前位置: 首页 > 面试题库 >

本地护照和node-jwt-simple

丁星火
2023-03-14
问题内容

如何在成功进行身份验证时结合本地护照以返回JWT令牌?

我想使用node-jwt-simple并查看passport.js,我不确定该怎么做。

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()时是否可以返回令牌?像这样…(只是伪代码)

if(User.validCredentials(username, password)) {
  var token = jwt.encode({username: username}, tokenSecret);
  done(null, {token : token}); //is this possible?
}

如果没有,我该如何退还令牌?


问题答案:

我想到了!

首先,您需要实施正确的策略。就我而言,是LocalStrategy,您需要提供验证逻辑。例如,让我们在护照本地使用一个。

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令牌创建。像这样:

(请记住禁用会话,否则您将必须实现序列化和反序列化功能。如果您不持久化会话,则不需要那些,如果您使用的是基于令牌的身份验证,则不需要这些)

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

// 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和POST用户名和密码(应始终通过SSL)时,上面的第一个代码段将尝试根据您提供的用户名查找用户,然后检查密码是否匹配(当然,您需要根据您的需要进行更改)。

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

希望这会帮助某人。如果我犯了任何错误或忘记了什么,请告诉我。



 类似资料:
  • 早些时候,当我使用Laravel5.2时,我使用了第三方软件包https://github.com/tymondesigns/jwt-auth/用于进行基于JWT的身份验证。我们只需要传递用户名和密码就可以获得令牌。 现在在laravel 5.3中,随着passport的引入,我想进行基于JWT的身份验证,但passport要求我指定客户端id和客户端密码以及用户名和密码。这在tymondesig

  • 我试图做api-auth通过检查生成令牌从登录用户的用户名与md5加密方法在laravel 5.5飞,不想保存令牌到用户的表。当用户注销时,令牌将无效。URL将是这样的: http://myserver.com/products?token=...... 我该怎么做? 新增-这是第44届世界技能大赛的测试项目,以下为测试项目文件: 认证 A.登录(v1/auth/登录) 描述:供客户端通过用户名和

  • Série de Vídeos - Coding Stuff: Projeto #01 - Desenvolvendo Aplicação JWT com Node + MongoDB + Vue & Azure Repositório responsável pelo primeiro projeto da série de vídeos: Coding Stuff. O objetivo da

  • 突然,当尝试通过护照创建JWT时,我开始在生产中遇到此错误,运行在Ubuntu / apache2上。据我所知,服务器上没有任何更改,没有安装,没有部署,它只是停止工作。 PHP 7.3 OpenSSL 1.0.1f Laravel 5.8 我还注意到这个错误的另一个版本。没有什么变化,所以我不知道为什么会出现这种错误。 注意这一点:

  • 我正在处理一个在平均堆栈上运行的Web应用程序(遵循TraversyMedia教程)。然而,我遇到了一个问题,这里提供的任何解决方案似乎都不适合我。每当我尝试访问我的/个人资料页面(除非您获得授权,否则该页面将受到保护)时,我都会收到返回的错误。但是,我已登录并拥有正确的访问令牌。 我已经看了护照jwt git。但是我所拥有的似乎是匹配的。我尝试过使用: 目前正在使用:ExtractJwt。fro

  • 我使用的是Laravel框架5.3版。9,通过composer全新下载未添加任何内容(除了)。 我做了文件中建议的所有事情。创建了表,路由启动,一切正常。然而,我需要护照的API。 我的路线是这样的: 所有的路由都在那里,没有相关的路由,因为Passport不提供任何开箱即用的东西。 API本身旨在供可信客户端使用,它是为需要登录的移动应用程序而设计的。不过,所述登录将绕过几个步骤。 一旦用户访问