Node.js Passport身份验证令牌

72

我正在编写一个nodejs应用程序,希望它既可以作为Web应用程序,又可以作为API提供者。一旦用户经过身份验证,我想为该用户分配一个令牌,以便在后续请求中使用。对于Web应用程序,使用passport很好处理,只需在会话中序列化和反序列化带有令牌的用户即可。然而,在响应API请求时,没有cookie可以设置来存储会话信息。理想情况下,passport应该同时在会话和请求正文中寻找令牌。是否有任何方法可以配置passport来实现这一点?

3个回答

130

只需在每个请求中使用访问令牌,不需要使用会话。以下是工作流程:

POST /signin
  1. 客户端请求中包含用户名和密码。
  2. 服务器使用Passport的本地策略对用户进行身份验证。请参阅passport-local
  3. 如果凭据代表有效用户,则服务器返回由某些生成器生成的访问令牌。 node-jwt-simple 是一个不错的选择。
  4. 如果凭证无效,则重定向到/signin

当客户端从授权服务器接收到访问令牌后,就可以在服务器上请求受保护的资源。例如:

GET /api/v1/somefunction?token='abcedf'

  1. 客户端使用token参数调用一些服务器API。
  2. 服务器使用Passport的承载者策略对令牌进行身份验证。请参阅passport-http-bearer

参考资料

使用 passport.js 和 express.js(node.js)创建安全的 OAuth API


1
非常感谢您。出于某种原因,我认为OAuth需要比这更复杂。 - SomethingOn
1
关于令牌生成,是否安全使用一个永不过期的令牌?我需要让令牌过期并生成新的吗? - sanfilippopablo
5
非常好的回答,但并非完全相关(抱歉两年后才评论!),您不应该将令牌作为GET参数传递!有很多可能泄漏它的地方,有人恶意获取令牌后果将不堪设想。 - Andy Ibanez
1
你说要使用node-jwt-simple进行加密。但是你没有解释为什么需要加密令牌以及如何验证令牌。你是否应该存储未加密的令牌,但将加密的令牌传递回客户端?然后当加密的令牌到达时,解密它,并验证解密后的令牌是否存在于数据库中? - lostintranslation
你如何将令牌发送给客户端?我所知的是,护照始终在重定向。你如何在客户端中持久保存令牌?以及你如何避免服务器记录令牌? - Manuel
显示剩余2条评论

7

0

在Node.js中,您可以使用Passport中的isAuthenticated()方法。在每个路由上,您可以进行检查if(req.isAuthenticated()),如果已经通过身份验证,则允许您访问该路由,或者您可以重定向或执行任何其他操作。在Passport中,您可以返回done(null, user)以进行成功登录,并将数据存储在cookie中,直到会话结束。在用户中,您可以获取有关用户的信息,例如电子邮件、密码等。

app.get('/home', (req, res) =>{
    if(req.isAuthenticated()){
        //render home page
    } else {
        // go back to the login page or throw soome error
    }
}) 

这与使用Express中间件(如Passport)的理念相违背。这不是一个干净或可维护的解决方案。 - JDenais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接