我正在开发一个应用程序,无论他登录的设备如何,它只需要单个用户的一个活动会话。我还没有为此编码,但我想知道我是否朝着正确的方向前进,或者是否有更好的方法来解决这个问题
此应用程序将始终连接到互联网,因此没有离线模式,因此这是我处理单会话情况的方法
-
从设备 A 调用登录服务时,服务器将维护一个会话 ID。
-
如果用户从任何其他设备(设备B)登录,则服务器将检查它是否来自设备DeviceA_sessionID A,如果不是,它将向设备B发送一条
400 BadRequest response
,并显示消息"请从您登录的所有设备注销以使用该应用程序"> -
服务器上的会话 ID 有效期为 2 天或一周。
我在这里尝试解决的主要问题是我不想有任何面向设备的依赖项,因为当我们恢复出厂设置或重新安装应用程序或购买新设备时,供应商 Id 或任何 Id 可能会更改。
在步骤 2 中,我认为终止设备A会话并允许使用新的会话ID登录设备B,然后在设备A上显示一条消息,指出您的会话已终止,这是一个好主意吗?或者只是等到会话到期?
借助服务器上的 sessionIds,我可以确保服务器具有确定每个用户一次只有一个设备会话处于活动状态并且任何其他会话刚刚终止的逻辑。
此外,用户会更改他们的设备,因此我假设使用 sessionId 用户仍然可以登录并为其新设备创建新的 sessionId,并且服务器可以终止旧设备。
让我知道这是否是一种有效的方法,或者是否有更好的方法来处理这种情况。
如果您有任何类型的授权,并且允许设备 B 中断设备的 A 会话,则可以在每个请求刷新授权令牌。因此,在新身份验证之后,前一个设备的会话将过期。
例如,您可以使用 JWT 授权令牌。更多 这里.
我是如何解决这个问题的,是通过使用sessions
而不是JWT
。不使用 JWT 的动机是我们没有在这里实现/使用任何声明来与服务器进行任何通信。
此外,当您从其他设备登录时,我们希望旧令牌无效,并且服务器可以轻松地使会话失效,而 JWT 的无状态性质不允许我们这样做,令牌在过期之前一直有效。