如何使用两个令牌(访问/刷新)进行授权(nodejs,express)

Posted

技术标签:

【中文标题】如何使用两个令牌(访问/刷新)进行授权(nodejs,express)【英文标题】:how to do authorization (nodejs, express) with two tokens (access/refresh) 【发布时间】:2021-06-07 17:29:32 【问题描述】:

晚上好,我遇到了一个问题,我需要使授权更安全且无需重新登录。我在互联网上读到您需要使用两个令牌(访问和刷新),但是如何正确地使用它们进行授权。您可以建议使用两个令牌进行有效授权的资源。

我的技术栈:

MongoDB ExpressJS ReactJS NodeJS

【问题讨论】:

您是在使用授权提供商(例如 okta、auth0、fusion auth)还是在自己的服务器上使用 OAuth/OICD? 在您自己的服务器上 【参考方案1】:

如果您请求使用 offline_access 范围进行身份验证,除了访问令牌之外,您还将获得一个刷新令牌。将此刷新令牌保存到数据库中,当您需要代表用户进行另一次调用时,您可以

    使用您现有的访问令牌进行呼叫。如果你没有得到 401,那你很好。 如果您确实收到 401,则您的令牌可能已过期,然后您可以使用刷新令牌和 grant_type=refresh_token 调用授权服务器上的令牌端点以获取新的访问令牌并再次尝试调用。李>

在进行另一次调用之前,始终使用刷新令牌请求新的访问令牌可能是最有意义的。

【讨论】:

你不会有任何带有代码示例的材料吗? @Krytoi 您现在如何进行身份验证? 我检查数据进行验证,搜索现有用户,创建令牌,并将其提供给响应 我需要在客户端存储一个刷新令牌吗? @Krytoi 永远不要在客户端上存储刷新令牌,除非在内存中【参考方案2】:

据我所知,您只处理访问令牌以进行授权。刷新令牌仅用于刷新过期的访问令牌。刷新令牌被交换为新的访问令牌 - 无需再次提供身份验证凭据。与重新验证相比,调用也(通常)花费一小部分时间。

【讨论】:

@ScottMclntosh 我需要将刷新令牌保存在数据库中吗? (我有这个 mongo)【参考方案3】:

一旦用户登录,给它两个令牌刷新和访问,将刷新令牌存储在数据库中,给访问令牌一个过期时间(根据您的要求,大约 5-10 分钟或更短)。 对于每个请求,用户将使用访问令牌,并且对于每个请求,后端应检查过期的访问令牌。

如果访问令牌过期,用户将通过将存储的刷新令牌发送到后端(使用专用端点)来获取新的访问令牌,后端将检查刷新令牌是否存在于数据库中,如果是的,将在响应中发送具有新过期时间的新访问令牌。

循环将一直持续到用户注销,在这种情况下,刷新令牌将从数据库中删除,一段时间后访问令牌也会过期。

【讨论】:

以上是关于如何使用两个令牌(访问/刷新)进行授权(nodejs,express)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AWS cognito 授权代码获取访问和刷新令牌

刷新德意志银行 API 访问令牌

Azure API 管理 - 如何刷新访问令牌后端 API?

如何在资源请求上重新生成刷新令牌和访问令牌?

刷新谷歌访问令牌时未授权_客户端

访问和刷新令牌