Node Express - 身份验证令牌的存储和检索

Posted

技术标签:

【中文标题】Node Express - 身份验证令牌的存储和检索【英文标题】:Node Express - Storage and retrieval of authentication tokens 【发布时间】:2016-04-12 23:24:30 【问题描述】:

我有一个 Express 应用程序设置,需要一些关于存储令牌的建议。

我在验证用户帐户后从 OAuth 2 服务器接收访问令牌,然后我需要将其用于后续 api 请求。

我想对客户端隐藏令牌值,我相信这样做的一种方法是将服务器上的令牌保存在编码的 cookie 中,以便在发出进一步请求时,这些请求可以通过中间件和 cookie 进行路由然后可用于检索存储在服务器端的令牌,然后用作对实际 api 端点的持续请求中的标头值。

实际上有人已经问过这个问题 - How to store an auth token in an Angular app 这正是我在我的应用程序中使用的流程,但答案是关于使用 Angular 服务,我不确定我是否愿意这样做,当然这都可以由 Express 处理,因此客户端代码不需要知道令牌,只需要 API 服务器返回的任何错误。

所以我认为我需要的流程摘要:

用户提交登录凭据 OAuth 2 服务器返回访问令牌 令牌保存在 Express 中的某个位置,由各种 id 键入 生成 cookie 并将其发回以响应客户端。 Cookie 可能包含编码的令牌值?或者可能是存储在 Express 中间件组件中的令牌值的 id? 客户端发出 api 请求,Express 路由中间件获取该请求。 Express 检查 cookie 的存在并解码令牌值,或者以某种方式从存储机制服务器端检索。 然后将令牌值用作 express 和最终 api 端点之间的标头

可能已经有中间件可以处理这种事情,我已经看到 PassportJS 这似乎是我可能想要使用的那种东西,但我不太确定它可以处理服务器上的 OAuth2 令牌流我正在反对(密码授予),但似乎更适合重定向登录 OAuth 流程。

我肯定需要在某个地方将令牌值保存在 Express 中,因此需要某种形式的存储(我认为不是在内存中)。

我对 Express 还很陌生,所以如果有任何关于如何解决这个问题的建议\建议,我将不胜感激。

谢谢

【问题讨论】:

当你从Oauth2服务器收到token时,你可以把它保存在用户端。您可以使用 cookie 或 localstorage html 5。 好的,cookie 方法是我的想法,但它需要将令牌的值编码回客户端,然后每次都将其解码,以便 Express 的后续请求到最终终点。 【参考方案1】:

正如您所描述的那样,最安全的方法是:

从某些第三方服务(Google、Facebook 等)获取 OAuth 令牌。 使用 Express 创建一个 cookie,并将该令牌存储在 cookie 中。确保在执行此操作时还设置了 securehttpOnly cookie 标志:这样可以确保客户端 javascript 代码或任何非 SSL 连接都无法读取 cookie。 每次用户向您的网站发出请求时,您的 Express 中的中间件都可以读取该 cookie,并用于向第三方服务发出您需要的任何 API 调用。

如果您的服务还需要在用户没有主动点击您的网站时向 Google/Facebook 等发出异步请求,您还应该将他们的令牌存储在您的用户数据库中的某个地方——这样您就可以在需要时代表用户提出请求。

我是 express-stormpath 的作者,这是一个 Node 身份验证库(类似于 Passport),这就是我们在那里做事以确保最大安全性的方式!

【讨论】:

一个很好的(对我来说)这个答案的好处是将访问令牌存储在后端/db 以及中是有效的,就像在前端 cookie 中一样。我想我会将刷新令牌存储在数据库中,并将访问令牌留在 cookie 中。

以上是关于Node Express - 身份验证令牌的存储和检索的主要内容,如果未能解决你的问题,请参考以下文章

Express、Passport 和 JSON Web 令牌 (jwt) 身份验证

如何通过 vue 路由器和服务器提供的 JWT 令牌管理用户身份验证?

基于角色的 jwt 授权

React 和 Express 身份验证

如何使用基于 JWT 令牌的 express 获取经过身份验证的用户信息

jwt on node - 客户端如何将令牌传递回服务器