【发布时间】:2019-04-12 16:31:41
【问题描述】:
我正在开发一个应用程序,它只需要一个用户的一个活动会话,无论他登录的设备如何。我还没有为此编写代码,但我想知道我是否正确方向或者有没有更好的方法来处理这个
此应用程序将始终连接到互联网,因此没有离线模式,因此这是我处理单会话案例的方法
从DeviceA调用登录服务时,服务器会维护一个sessionId。
如果用户从任何其他设备 (DeviceB) 登录,那么服务器将检查它是否来自具有 DeviceA_sessionID 的 DeviceA?如果没有,它会向 DeviceB 发送一个
400 BadRequest response,并带有一条消息“请从您登录的所有设备上注销以使用该应用程序”服务器上的 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