0

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

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

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

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

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

任何建议都非常感谢!

4

1 回答 1

1

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

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

编辑

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

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

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

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

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

您应该看看如何在 Android 中安全地存储访问令牌和秘密?有关存储令牌的一些信息。

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

于 2021-10-24T07:18:44.360 回答