nodejs护照认证令牌


71

我正在编写一个想同时用作Web应用程序和API提供程序的Node.js应用程序。验证用户身份后,我想为该用户分配一个令牌,以用于后续请求。这对于Web应用程序的通行证非常有用,因为我只是在会话中使用令牌对用户进行序列化和反序列化。但是,在响应API请求时,没有用于设置存储会话信息的cookie。理想情况下,护照将在会话和请求正文中都寻找令牌。有什么方法可以配置护照来完成此任务吗?

Answers:


130

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

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

当客户端从授权服务器收到访问令牌时,它可以向服务器上的受保护资源发出请求。例如:

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

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

参考文献

使用password.js和express.js(node.js)制作安全的oauth API


1
非常感谢你。出于某种原因,我认为OAuth需要比这更复杂。
SomethingOn 2014年

1
关于令牌生成,拥有一个永不过期的令牌是否安全?我是否必须使令牌过期并生成新的令牌?
sanfilippopablo 2014年

@giamfreeg为了安全起见,令牌应在一定时间后过期。
volatilevar

5
很好的答案,但是虽然不完全相关(并且很抱歉在两年后发表评论!),但是您不应该在GET参数中传递令牌!有很多潜在的地方可能会泄漏它,有恶意的人会发现它。
Andy Ibanez 2015年

1
您说要使用进行加密的node-jwt-simple。但是您跳过了为什么需要加密令牌以及如何验证令牌的知识。您是否应该存储未加密的令牌,但将加密的令牌传递回客户端?然后,当一个加密的令牌进入时,对其进行解密,并验证该解密的令牌是否存在于数据库中?
lostintranslation 2015年

7

正如bnuhero所提到的,您不需要会议(尽管这种方法也有其优点)。这是我为此开始的样板项目: https //github.com/roblevintennis/passport-api-tokens

这是一种替代方法,很容易理解(但确实使用了会话)。可能是一个很好的交叉引用:http : //scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local

与另外一个参考相关:http : //mherman.org/blog/2013/11/11/user-authentication-with-passport-dot-js/


0

您可以在nodejs的护照中使用isAuthenticated()方法。在每条路由上,您都可以检查if(req.isAuthenticated()),如果它已经通过身份验证,则可以访问该路由,或者可以在else块中重定向或执行任何其他任何其他执行。在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
    }
}) 

这违背了使用像Passport这样的Express Middleware的想法。不是干净或可维护的解决方案。
JDenais
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.