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