如何处理匿名用户的过期令牌
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? 以获取有关存储令牌的一些信息。
总而言之,我永远不会担心匿名用户的安全性,并在设计系统时牢记这一点
我想允许我的应用程序的用户匿名登录(这将使用随机生成的电子邮件和密码为他们创建一个帐户),如果他们想要创建一个永久帐户,他们将可以简单地绑定邮箱和密码。
我使用令牌、访问和刷新,这意味着匿名用户和经过身份验证的用户的常规令牌流是相同的。
匿名用户的问题是,如果用户长时间(大于刷新令牌)未登录应用程序怎么办,这意味着现在刷新令牌已过期且无效。
我该如何处理这种情况?我不能像往常一样要求他们重新进行身份验证,因为他们不知道他们是凭据,而且我不能冒丢失用户数据的风险。
我唯一能想到的就是尝试使用本地首选项(例如 DataStore/SharedPreferences 结合 KeyStore)通过加密安全地保存他们的凭据,当这种情况确实发生时,我会简单地重新登录他们。但我不确定这是否足够好。
非常感谢任何建议!
您想要实现的似乎是忽略了 JWT 令牌的 exp
字段。省略它或设置为 iat
年后的值将解决问题。
但这意味着您必须调整令牌获取机制,并且匿名用户和注册用户都不会完全相同。
编辑
刷新令牌在任何情况下都不会永远有效。您应该使用秘密(随机生成的字符串,对数据库中的每个用户都是唯一的)对其进行验证。必须在每次更改密码(通过应用程序或忘记密码流程)和每次“从所有设备注销”操作时重新生成此密码。它用于每个访问令牌获取。
至于匿名身份验证 - 这不是使用 JWT 令牌时的标准方法。您不应该将这些用户与经过身份验证的用户一样对待,并且应该限制他们对应用程序内容的访问。通常您会在客户端保留尽可能多的信息,而不是将其存储在服务器上。
我想说的是,您无法让您的匿名用户与经过身份验证的用户一样安全,因为您只是通过不询问电子邮件和密码而忽略了一个(也是最重要的)保护级别。
访问刷新令牌几乎与访问用户密码相同。当密码更改时 - 刷新令牌也会更改。唯一的区别是刷新令牌有一个到期日期。由于密码没有存储在设备上的任何地方,只有用户知道,它实际上增加了一层额外的安全性——攻击者将无法重新登录,因为他不知道密码。
问题是您想在设备上存储凭据。这与存储没有过期的刷新令牌相同,因为攻击者将能够从存储中读取凭据并永远重新登录。就是这个意思。
您应该查看 How to securely store access token and secret in Android? 以获取有关存储令牌的一些信息。
总而言之,我永远不会担心匿名用户的安全性,并在设计系统时牢记这一点