nodejs护照身份验证令牌

Posted

技术标签:

【中文标题】nodejs护照身份验证令牌【英文标题】:nodejs passport authentication token 【发布时间】:2013-06-28 03:16:13 【问题描述】:

我正在编写一个 nodejs 应用程序,我想将它用作 Web 应用程序以及 API 提供程序。一旦用户通过身份验证,我想为该用户分配一个令牌以用于后续请求。这非常适用于 Web 应用程序的护照,因为我只是在会话中使用令牌序列化和反序列化用户。但是,在响应 API 请求时,没有设置 cookie 来存储会话信息。理想情况下,护照会在会话和请求正文中查找令牌。有没有办法配置护照来完成这个?

【问题讨论】:

【参考方案1】:

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

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

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

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

    客户端使用令牌参数调用一些服务器 api。 服务器使用护照的承载策略对令牌进行身份验证。见passport-http-bearer。

参考文献

Make a secure oauth API with passport.js and express.js (node.js)

【讨论】:

非常感谢您。出于某种原因,我认为 OAuth 需要比这更复杂。 关于令牌生成,拥有一个永不过期的令牌是否安全?我必须使令牌过期并生成新令牌吗? @giamfreeg 出于安全考虑,令牌应在一段时间后过期。 很好的答案,但虽然不完全相关(很抱歉两年后发表评论!),您不应该在 GET 参数中传递令牌!有很多潜在的地方你可能会泄露它,并且不怀好意的人会抓住它。 您说要使用 node-jwt-simple 进行加密。但是您跳过了为什么需要加密令牌以及如何验证令牌。您是否应该存储未加密的令牌但将加密的令牌传递回客户端?那么当一个加密令牌进来时,解密它,并验证解密后的令牌是否存在于数据库中?【参考方案2】:

正如 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/

【讨论】:

【参考方案3】:

您可以在 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 中间件的想法。不是一个干净或可维护的解决方案。

以上是关于nodejs护照身份验证令牌的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要使用快速会话以及护照和 JSON Web 令牌进行身份验证?

NodeJs Express - 将请求参数传递给护照身份验证

Laravel 通过生成的令牌进行身份验证,无需护照和 jwt

Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置

节点护照错误:未知身份验证策略“本地登录”

模块导出,nodejs对于护照身份验证需要太长时间