如何处理匿名用户的过期令牌

How to handle anonymous user's expired token

我想允许我的应用程序的用户匿名登录(这将使用随机生成的电子邮件和密码为他们创建一个帐户),如果他们想要创建一个永久帐户,他们将可以简单地绑定邮箱和密码。

我使用令牌、访问和刷新,这意味着匿名用户和经过身份验证的用户的常规令牌流是相同的。

匿名用户的问题是,如果用户长时间(大于刷新令牌)未登录应用程序怎么办,这意味着现在刷新令牌已过期且无效。

我该如何处理这种情况?我不能像往常一样要求他们重新进行身份验证,因为他们不知道他们是凭据,而且我不能冒丢失用户数据的风险。

我唯一能想到的就是尝试使用本地首选项(例如 DataStore/SharedPreferences 结合 KeyStore)通过加密安全地保存他们的凭据,当这种情况确实发生时,我会简单地重新登录他们。但我不确定这是否足够好。

非常感谢任何建议!

您想要实现的似乎是忽略了 JWT 令牌的 exp 字段。省略它或设置为 iat 年后的值将解决问题。

但这意味着您必须调整令牌获取机制,并且匿名用户和注册用户都不会完全相同。

编辑

刷新令牌在任何情况下都不会永远有效。您应该使用秘密(随机生成的字符串,对数据库中的每个用户都是唯一的)对其进行验证。必须在每次更改密码(通过应用程序或忘记密码流程)和每次“从所有设备注销”操作时重新生成此密码。它用于每个访问令牌获取。

至于匿名身份验证 - 这不是使用 JWT 令牌时的标准方法。您不应该将这些用户与经过身份验证的用户一样对待,并且应该限制他们对应用程序内容的访问。通常您会在客户端保留尽可能多的信息,而不是将其存储在服务器上。

我想说的是,您无法让您的匿名用户与经过身份验证的用户一样安全,因为您只是通过不询问电子邮件和密码而忽略了一个(也是最重要的)保护级别。

访问刷新令牌几乎与访问用户密码相同。当密码更改时 - 刷新令牌也会更改。唯一的区别是刷新令牌有一个到期日期。由于密码没有存储在设备上的任何地方,只有用户知道,它实际上增加了一层额外的安全性——攻击者将无法重新登录,因为他不知道密码。

问题是您想在设备上存储凭据。这与存储没有过期的刷新令牌相同,因为攻击者将能够从存储中读取凭据并永远重新登录。就是这个意思。

您应该查看 How to securely store access token and secret in Android? 以获取有关存储令牌的一些信息。

总而言之,我永远不会担心匿名用户的安全性,并在设计系统时牢记这一点