【问题标题】:How to handle anonymous user's expired token如何处理匿名用户的过期令牌
【发布时间】:2021-12-10 00:11:37
【问题描述】:

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

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

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

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

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

非常感谢任何建议!

【问题讨论】:

    标签: android token anonymous-users


    【解决方案1】:

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

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

    编辑

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

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

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

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

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

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

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

    【讨论】:

    • 您好,感谢您的回答。但这是否意味着,如果现在攻击者在没有到期日期(或到期日期很长)的情况下获得此类令牌,​​他将始终可以访问特定用户的帐户?
    • 是的,完全正确。这就是为什么我们为它们设置到期日期并要求用户重新登录并提供注销所有设备的机会,只是出于安全原因。问题是,加密重新登录凭据或加密刷新令牌之间没有区别。这是同一件事。如果攻击者可以访问凭据 - 他将拥有与拥有刷新令牌相同的权力。但是匿名身份验证通常意味着低级别的安全要求,所以我要么不会担心可能的攻击,要么会强制用户注册。
    • 所以无论哪种方式我都需要加密某些东西,无论是它的凭据还是刷新令牌。会说使用 KeyStore 可以安全地保存密钥吗?您能否详细说明一下我必须对令牌获取代码进行哪些更改?谢谢!
    • 另外,没有区别吗?使用凭据,您可以通过更改用户密码来修复此类攻击。但是具有无限刷新令牌,因为它永远有效。如果我错了,请纠正我
    • 我想我还有一些研究要做,因为我不认为需要使用客户端密码来实现 JWT 访问和刷新令牌。我认为的另一件事是让匿名用户完全访问应用程序和服务器功能(与普通用户相同),只需让他们可以附加电子邮件和密码并从匿名帐户转换为普通帐户。感谢您非常详细的回答。如果您有任何推荐的资源来了解我必须保存在客户端和服务器上的这些客户端密码,这也会有所帮助?
    猜你喜欢
    • 2021-08-03
    • 2021-12-31
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2016-11-13
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多