【问题标题】:How to detect if the user is active only on one device at a given time in both iOS and Android如何在 iOS 和 Android 的给定时间检测用户是否仅在一台设备上处于活动状态
【发布时间】:2019-04-12 16:31:41
【问题描述】:

我正在开发一个应用程序,它只需要一个用户的一个活动会话,无论他登录的设备如何。我还没有为此编写代码,但我想知道我是否正确方向或者有没有更好的方法来处理这个

此应用程序将始终连接到互联网,因此没有离线模式,因此这是我处理单会话案例的方法

  1. 从DeviceA调用登录服务时,服务器会维护一个sessionId。

  2. 如果用户从任何其他设备 (DeviceB) 登录,那么服务器将检查它是否来自具有 DeviceA_sessionID 的 DeviceA?如果没有,它会向 DeviceB 发送一个400 BadRequest response,并带有一条消息“请从您登录的所有设备上注销以使用该应用程序”

  3. 服务器上的 SessionId 有效期为 2 天或一周。

我在这里要解决的主要问题是我不希望有任何面向设备的依赖项,因为当我们进行出厂重置或重新安装应用程序或购买新设备时,vendorId 或任何 Id 都可能发生变化。

在第 2 步中,我认为终止 DeviceA 会话并允许使用新的会话 ID 登录到 DeviceB 然后在 DeviceA 上显示您的会话已终止的消息是个好主意吗?还是等会话过期?

在服务器上的 sessionIds 的帮助下,我可以确保服务器有逻辑来确定每个用户一次只有一个设备会话处于活动状态,而任何其他会话都刚刚终止。

此外,用户更改了他们的设备,所以我假设用户仍然可以使用 sessionId 登录并为其新设备创建一个新的 sessionId,并且服务器可以终止旧设备。

让我知道这是一种有效的方法还是有更好的方法来处理这种情况。

【问题讨论】:

  • 您如何识别唯一设备,因为 iOS 消除了唯一设备标识符?您没有提到的其他一些用例,如果用户的会话崩溃(即没有正常退出)会发生什么。如果他们尝试从同一设备重新登录,但识别出新会话,他们是否将不得不等待一周?会话如何结束和清除?
  • 我不是因为 ios 的限制,我打算做的是当设备发出请求时,它会检查会话 ID 是否未过期,如果没有则处理请求。如果会话过期,则再次显示登录屏幕。我打算在这里使用 JWT 令牌@MichaelDougan
  • 另一个线程建议在成功登录后,API 可以返回一个 UUID,然后将其保存在用户的钥匙串中。我不熟悉 JWT 令牌,但也许这类似于它们的工作方式?第一次从设备登录时,设备会发送一个空白 UUID,API 会返回一个。后续登录会将保存的 UUID 传递给 API 进行验证。
  • 我确实考虑过那个,但是 uuid 将永远存在并且它不会过期,jwt 已经有一个内置的令牌过期时间,我打算使用它并在令牌过期时显示登录屏幕在我的最后。 @MichaelDougan

标签: android ios swift


【解决方案1】:

如果您有任何类型的授权并且允许设备 B 中断设备 A 的会话,您可以在每次请求时刷新授权令牌。因此,在新的身份验证之后,前一个设备的会话将过期。

例如,您可以使用 JWT 授权令牌。更多here

【讨论】:

  • 我们确实有一个登录服务,但我们没有为登录返回一个 JWT 令牌,所以我想要让这个工作我们需要在服务器端设置 JWT?
  • @NSDumb 是的。但是您可以使用任何类似时间的身份验证会话令牌。
【解决方案2】:

我解决这个问题的方法是使用sessions 而不是JWT。不使用 JWT 的动机是我们没有在此处实现/使用任何声明来与服务器进行任何通信。

此外,当您从其他设备登录时,我们希望旧令牌无效,并且服务器可以轻松地使会话无效,而 JWT 的无状态特性不允许我们这样做,并且令牌将一直有效,直到它被过期了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 2016-07-04
    • 2019-04-14
    • 2017-04-25
    • 1970-01-01
    • 2022-01-01
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多