JWT:使用 grant_type=password 时刷新令牌的优势是啥

Posted

技术标签:

【中文标题】JWT:使用 grant_type=password 时刷新令牌的优势是啥【英文标题】:JWT: what is the advantage of a refresh token when using grant_type=passwordJWT:使用 grant_type=password 时刷新令牌的优势是什么 【发布时间】:2021-01-23 04:01:56 【问题描述】:

我正在关注 this article 以了解刷新令牌。

在我的情况下,我必须使用 grant_type=password 连接到 REST api,并且我会收到一个寿命为 5 分钟的令牌。因此,我必须每 5 分钟发出一个 POST 请求,传递客户端 ID、用户名和密码以获取新的访问令牌。

另一种选择是使用 grant_type=refresh_token 发出 POST,而无需发送用户名和密码。就我而言,我正在使用 api,因此传递凭据不涉及最终用户的任何操作。对我来说,这只是为了在 POST 请求中发送更多参数。

在这两种情况下,我必须每 5 分钟发布一次新帖子。

这是使用 reresh 令牌的唯一优势(不需要再次传递凭据)还是我还缺少任何其他东西?

【问题讨论】:

【参考方案1】:

背景资料

OAuth 2.0 Password Grant

密码授权类型是一种将用户凭据交换为访问令牌的方法。由于客户端应用程序必须收集用户的密码并将其发送到授权服务器,因此不建议再使用此授权。

OAuth 2.0 Refresh Token

当访问令牌过期时,客户端使用刷新令牌授权类型将刷新令牌交换为访问令牌。

这允许客户端继续拥有有效的访问令牌,而无需与用户进一步交互。

考虑一下。

假设我将我的 twitter 帐户的登录名和密码添加到您的应用程序中,然后您使用它来请求从 twitter 访问可能的帐户以发布。三个月后,我忘记了我已经在我的 Twitter 帐户上设置了你很棒的应用程序,然后我更改了密码。你的系统会崩溃。

现在假设我使用 Oauth2 授予您访问我的 Google 驱动器帐户的权限,您的出色应用现在可以在我的驱动器帐户上执行它需要执行的任何操作。现在三个月后我又忘记了我给了你很棒的应用程序访问权限,我记得你看到了一条金鱼。我更改密码。什么都没有发生,您的出色应用仍然可以访问。

现在考虑一下,使用 oauth2,我可以授予您访问权限,只能从我的 google 驱动器帐户中读取,而不是更新它(范围)。这和系统知道它实际上并不是我执行这些操作。

在大多数情况下,通过客户端登录(登录名和密码),系统会认为它是发出请求的帐户的实际所有者。在您拥有完全访问权限的大部分情况下,您也可以不使用客户端登录来限制访问。

注意

是的,我忽略了关于返回的两个令牌的部分,即过期时间。那是因为出于所有密集目的,它们是相同的,但这在很大程度上取决于您使用的身份验证服务器的设置方式。它们可以设置为仅在一个小时或一天内有效。它们可能会为您提供不同的访问范围,这又因身份验证服务器而异。

【讨论】:

以上是关于JWT:使用 grant_type=password 时刷新令牌的优势是啥的主要内容,如果未能解决你的问题,请参考以下文章

WSO2 身份服务器 JWT 访问令牌

Laravel 和 Passport,随机 401 错误

spring如何编写oauth客户端?

Open ID Connect with JWT Bearer Token Grant Type

如何在 access_token JWT 中添加更多数据

跨域 Ajax 请求 WSO2 IS