应该存储哪些 JWT 令牌以供以后使用?

Posted

技术标签:

【中文标题】应该存储哪些 JWT 令牌以供以后使用?【英文标题】:What JWT Tokens should be stored for use later? 【发布时间】:2020-05-04 13:17:43 【问题描述】:

我正在查看为用户登录实施的 Cognito,并希望更好地了解验证 JWT 的过程。

有问题的应用程序位于 asp.net 4.5 MVC 上,与 .NET Core 无关。我可以在网上找到的有关 AWS Cognito 的唯一信息与 .NET 核心有关。

我了解此处记录的每种令牌类型的含义: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html#amazon-cognito-user-pools-using-the-id-token

我也了解验证 JWT 所需的步骤: https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html

我的问题是需要验证哪个 JWT 以及在什么阶段?

示例 1. 用户登录后,登录后会返回访问、ID 和刷新令牌。此时需要验证所有令牌还是只需要验证访问令牌? p>

是否仅在尝试使用刷新令牌之前对其进行验证(以便获得新的访问和 ID 令牌)? 或者是否应该根据任何授权的内容请求验证所有令牌?

哪些令牌应该存储在 FormsAuthentication Cookie 中以供以后使用?我们在 asp.net 中使用标准的[Authorize] 模式。

【问题讨论】:

【参考方案1】:

推荐的方法是验证访问令牌,因为它包括身份验证和授权。您应该在提供对受保护资源的访问之前验证访问令牌。

id 令牌包含经过身份验证的用户的声明(信息)。它也可用于验证,但使用访问令牌具有更大的功能,因为您可以创建范围来定义权限和角色。访问令牌也是许多 Cognito API 用户操作的输入。

AWS Cognito 遵循 OpenID Connect 协议,该协议建立在 Oauth2 之上,这些术语源自这些协议。

刷新令牌是一个长期令牌,用于检索更新的短期令牌(id 令牌、访问令牌)。目前在 Cognito 的实施中,寿命较短的令牌每 1 小时到期一次,并且刷新令牌可在用户池中配置。在刷新令牌无效/过期的情况下,尝试检索更新的短期令牌将失败,因此您不需要自己验证刷新令牌。

您可以存储刷新令牌(在某种会话中)以帮助检索新的访问、id 令牌而无需重新验证。您还可以存储访问令牌,以便每小时仅使用一次刷新令牌(访问令牌过期时),以防止发布不必要的令牌和往返 Cognito。如果您有兴趣保留用户声明(存储在 id 令牌的 JWT 中的用户信息),id 令牌存储实际上取决于您的用例。

【讨论】:

【参考方案2】:

问题:此时需要验证所有令牌还是只需要验证访问令牌?

答案: 验证始终仅在访问令牌上完成。

刷新令牌本身不需要验证。它仅用于获取一组新的 ID 令牌和访问令牌。

问题: 哪些令牌应该存储在 FormsAuthentication Cookie 中以供以后使用?

答案:这是特定于实施的。没有关于必须保存什么令牌的规则。

如果要求只知道用户的电子邮件或电话号码,则只需保存 ID 令牌即可。

如果要求允许用户一次性访问长达一小时, 那么只存储访问令牌就足够了。

如果要求允许用户在不提示输入密码的情况下访问资源长达 30 天,则必须保存刷新令牌。

【讨论】:

谢谢@Gopinath。要求是用户在访问令牌可用之前保持登录状态(取决于 IDP 配置)。因此我们应该保存访问令牌吗?此外,我们是否需要在每个[Authorize] 页面请求上验证该令牌,还是仅在最初从 IDP 接收令牌时验证它? 谢谢,@StuartM。在这种允许用户在访问令牌长度内保持登录状态的情况下,对于从 UI 到后端的每个入站请求,只需保存和验证访问令牌令牌。令牌可以通过两种方式保存 - 作为 cookie,或作为嵌入的“授权标头”(通常称为不记名令牌)。对于来自 UI 的每个入站请求,后端必须验证从 cookie 或授权标头中挑选的令牌。这可以确保整个用户旅程的安全,并且还可以在令牌过期时轻松提示用户登录。 谢谢,cookie 的过期时间是否应该设置为访问令牌的过期日期/时间?出于安全原因,我是否应该防止被更改,验证令牌并检查其到期日期?? 是的,斯图尔特。你说的对。将 cookie 的到期时间设置为与令牌的到期时间相匹配是一种很好的做法。它将增强安全性并减少对服务器的不必要调用。

以上是关于应该存储哪些 JWT 令牌以供以后使用?的主要内容,如果未能解决你的问题,请参考以下文章

存储 JWT 令牌以供多域使用的最佳方法

php 文件以获取设备令牌并将其存储以供以后用户使用

我应该在哪里存储 JWT 令牌?

我应该将 JWT 令牌存储在 IndexedDB 中吗?

在 Redis 中存储 JWT 令牌的标准做法是啥?

反应并将 jwt 令牌存储在本地存储中