0

我了解使用访问/刷新令牌的身份验证过程是这样的:

  1. 交换 refresh_token 的用户名/密码
  2. 使用 refresh_token 获取 access_token
  3. 使用 access_token 请求(不需要数据库调用)
  4. 如果 access_token 已过期 -> 使用 refresh_token 获取新的(需要数据库调用)

管理/撤销访问的流程:

  1. 交换 refresh_token 的用户名/密码
  2. 在数据库中存储 refresh_token
  3. 使用 refresh_token 获取 access_token 时检查 DB 中的已撤销标志
  4. 通过设置撤销标志来阻止

数据库交互:只需要刷新令牌。即频率取决于access_token 的生命周期。

用户体验:需要登录

  • 第一次访问
  • refresh_token 已撤销
  • refresh_token 已过期

安全隐患:

  • refresh_token 被盗:在手动撤销或很长时间之前易受攻击
  • access_token被盗:短时间内易受攻击。无法撤销
  • 注销:access_token 在过期/无法撤销之前保持有效

没有 refresh_token:+没有长期存在的漏洞 -Bad UX。用户需要经常登录

现在我想知道为什么我们不能只使用 access_token 作为 refresh_token:

  1. 交换 access_token 的用户名/密码
  2. 在数据库中存储 access_token
  3. 对所有请求使用 access_token(无数据库调用)
  4. 过期时:如果设置了撤销标志,则检查 DB。如果不是 -> 创建新的 access_token 并为旧令牌设置撤销。(可选地,在到期后只允许 x 时间。这相当于 refresh_token 的到期日期)

现在 UX/security/DB_call_frequency 似乎是相同的。那么为什么我们需要一个单独的 refresh_token 呢?

我能看到的唯一论点是,将它们分开可以降低 refresh_token 被盗的风险,因为它的发送频率较低。

4

1 回答 1

0

创建新的 access_token 并为旧令牌设置撤销。(可选地,在到期后只允许 x 时间。这相当于 refresh_token 的到期日期)

您想通过交换用户名和密码再次执行此操作吗?

如果是这样,则用户需要再次登录。您可以使用客户端凭据授予https://www.rfc-editor.org/rfc/rfc6749#section-4.4或隐式流https://www.rfc-editor.org/rfc/rfc6749#section-4.2发送访问仅令牌,这些流不会发送刷新令牌。如果您可以发送用户名和密码,则可以在每次过期时使用客户端凭据授予和请求访问令牌。

于 2017-08-08T23:21:36.753 回答