如果用户在另一台设备上登录,则自动注销用户

Posted

技术标签:

【中文标题】如果用户在另一台设备上登录,则自动注销用户【英文标题】:Automatically Log a User Out if They Log in on Another Device 【发布时间】:2014-06-21 04:57:42 【问题描述】:

我有一个需要用户登录的应用程序。登录是通过对我的后端 REST API 的 POST 请求处理的,如果登录详细信息正确,它会生成一个新的访问令牌并将其返回给应用程序(其中然后保存在钥匙串中)。我的问题是,当用户同时从多个设备登录时,我该如何处理?首先登录的设备不会意识到他们的访问令牌已过期,但会继续尝试发送将被拒绝的请求(因为访问令牌不再与存储在数据库中的访问令牌匹配)。我曾考虑在我的 AppDelegate 中检查访问令牌是否与 viewDidLoad 中的数据库令牌匹配,但这仅在首次加载应用程序时才有效。是否已经为这类事情建立了最佳实践?如果有,那是什么?

到目前为止,我想到的最佳解决方案是每次用户登录时重新发出相同的访问令牌,但这对我来说似乎不安全。这是一种安全的处理方式吗?

【问题讨论】:

听起来您需要与您的服务器人员讨论如何确定令牌是否过期。在我看来,它应该只是服务器返回的“通过其他设备登录”或“令牌过期”错误。 我是服务员。我知道如何告诉客户端令牌已过期,我在询问令牌何时过期以及如何在 ios 端识别/处理过期令牌。 【参考方案1】:

最好在每次登录时颁发一个新令牌。令牌是可消耗的,区分不同设备和浏览器上的用户会话很有用(参见Facebook's session management 示例)。

有两种可能的方式来处理双重登录场景:

    为数据库中的每个用户维护多个活动令牌,并在退出时使每个令牌失效 每个用户只允许一个令牌,使现有令牌在登录时失效

选择取决于您的应用程序的性质。在第二种情况下,第一个客户端在应用程序进行网络调用之前不会知道其会话无效。那时,您的服务器应该返回一个自定义错误以指示令牌已过期。然后应用程序应提醒用户并将他们返回到登录屏幕。

【讨论】:

以上是关于如果用户在另一台设备上登录,则自动注销用户的主要内容,如果未能解决你的问题,请参考以下文章

如果选项卡关闭,则自动注销[重复]

当用户注销 php 中打开的选项卡之一时,自动注销所有打开的选项卡

iPhone - 获取用户交互事件和自动注销

Laravel 5 - 从他的所有设备中注销用户

用户注销时会话无效(Spring)

注销时如何使用户会话无效?