防止使用Cognito同时登录

Mat*_*ner 8 authentication amazon-web-services amazon-cognito aws-lambda react-native

我们有使用Cognito进行身份验证的React Native应用程序。我们希望防止同一用户ID同时从多个设备登录。

希望我们可以为此使用Cognito预身份验证触发器。不幸的是,似乎我们不能仅仅呼吁globalSignOut用户,因为那不会使已经发行且当前处于活动状态的令牌无效(请参阅https://github.com/amazon-archives/amazon-cognito-identity-js / issues / 21#issuecomment-331472144)。

另一个想法是,如果用户在其他地方登录,则拒绝登录。但是我们看不到一种可靠的方式来判断用户是否已经登录。我们可以查看是否为该用户发行了有效的令牌,但是看不到当前是否与活动会话相关联。

我们还考虑过维护自己的活动会话数据库,但是没有退出触发器,因此我们不知道何时从数据库中删除会话。

Jay*_*ani 7

您可以使用令牌认证系统,

为每次登录分配一个全新的令牌,并检查可用令牌。

如果有任何令牌可供用户使用,这意味着他/她已在其他设备上登录,则在这种情况下,您可以提示用户您已在其他设备上登录..确定要从该设备注销吗?然后单击是,您可以清除该用户的所有令牌。并发行一个全新的令牌。

AUTO LOGOUT:此令牌应在整个后端传递,即每个API调用令牌的标头中都应存在……并应在后端进行任何操作之前进行检查。如果令牌不可用,则抛出401。在您的应用程序中,如果有任何API抛出401,则表示用户未经授权,应注销。

要么

您的应用应该正在监听一个套接字,当它收到一条消息时,该套接字会响应注销。因此,每当您的用户登录时,注销消息都会在套接字之间传递,并且具有某些令牌ID或唯一ID的适当设备将获得该消息,并从所有其他设备中注销特定用户。

要么

有一个通知接收器,该接收器将在必要时用于注销,与套接字相同。


Dav*_*vid 5

阅读您提供的 API 令牌/会话系统的链接似乎很长时间以来就存在设计缺陷。
因此,如果内部没有自己的令牌系统,cognito您可能不会获得可靠的结果,至少在系统的当前状态下(由于存储库已存档,所有者不会进一步开发)。

我建议在数据库表中为用户提供一个自己的字段,其中每次登录都使用自己的令牌。同一个表中的第二个自己的字段带有时间戳,其中保存了最后一次访问。如果上次访问早于预定义的 30、60 或 120 分钟时间,则任何用户都会被注销。如果最后一次访问早于时间限制,则登录掩码必须提供一个随机访问令牌,该令牌与数据库中的访问令牌进行比较:
- 如果数据库中的访问令牌对于活动会话来说太旧,或者只要不存储访问令牌,就可以授予访问权限,这意味着登录成功。
- 当前时间与数据库中保存的时间戳的比较适用于用户从未故意注销而只是由于断开连接或被动注销的情况。我想这种情况会经常发生,所以也不例外
- 通过单击按钮注销应该会破坏数据库中的访问令牌,以便用户可以立即从任何设备登录,甚至可以从之前的另一设备登录。
- 如果数据库中存在有效的访问令牌,则不会授予新的访问权限,并且用户应该收到一条消息,表明他必须在另一次登录时首先注销。
- 访问令牌可以与会话 ID 的第三个自己的字段存储在一起,以使其更加可靠和安全。注销时,会话令牌字段也可以被清除。如果需要保存在用户记录中,可以从全局会话中复制会话令牌。
- 任何检查仅在登录时完成,令牌不必包含在每个页面上。
- 在主动注销时,必须销毁令牌才能再次直接登录,否则用户必须等到最大时间。达到再次登录的时间限制 - 至少在之前的另一台设备上。

由于登录本身当前独立于必须实施的检查而完成,因此可以完全保留新的访问令牌,而仅使用会话 ID,因为会话 ID 在任何设备和浏览器上都不同。但也许存在一种情况,会话 ID 和访问令牌之一可以更改,但另一个不能更改 - 我不这么认为,但也许我在考虑中错过了一些东西。

如果您在每个页面上提供访问令牌(如 @Jadeep Galani 提议的那样)或在 cookie 中(在相应的检查旁边),您还可以提供一个从所有设备注销的按钮。这将使用户能够随时更改登录信息,甚至无需在上次使用的设备上注销。如果每个页面或 cookie 中没有访问令牌,则这种通用注销功能解决方案是不可能的,因为仅在登录时检查访问权限,而不是在所有页面上检查访问权限。

一个普遍的问题是,是否仍然值得依靠 Buggy 进行cognito登录,或者只是用自己的解决方案完全替换它。您甚至可以在站点中以包装类的形式实现所需的身份验证,并且可以在不更改该实现的情况下替换具体的登录系统。


小智 3

您可以通过设备的UUID来识别是否是同一用户。在每个请求头中添加一个UUID,将其记录在DB中,然后就可以做你想做的事情了。