防止使用Cognito同时登录

时间:2019-03-22 15:45:25

标签: amazon-web-services react-native authentication aws-lambda amazon-cognito

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

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

答案 1 :(得分:2)

您可以使用设备的UUID来识别它是否是同一用户。将UUID添加到每个请求标头中,以将其记录在数据库中,然后您就可以执行所需的操作。

答案 2 :(得分:0)

由于时间长,读取设计提供的API令牌/会话系统链接似乎是错误的。
因此,cognito中没有自己的令牌系统,至少在系统的当前状态下,您可能不会获得可靠的结果(由于存储库已归档,因此所有者将不再进行开发)。 / p>

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

由于登录本身当前是独立于必须执行的检查完成的,因此有可能完全放弃新的访问令牌,而仅使用会话ID,因为在任何设备和浏览器上都不同。但是,也许存在一种情况,会话ID和访问令牌中的一个可以更改,而另一个则不能更改-我认为不是,但是也许我在考虑中有所遗漏。

如果您在@Jadeep Galani提议的每个页面上或cookie中提供访问令牌-在相应的支票旁边-您还可以提供一个按钮以从所有设备注销。这将使用户可以随时更改登录名,甚至无需注销最后使用的设备。如果没有在每个页面或cookie中都具有访问令牌,则无法使用这种一般的注销功能解决方案,因为否则只能在登录时检查访问权限,而不能在所有页面上进行访问。

一个普遍的问题是,依靠越野车cognito进行登录还是将其完全替换为自己的解决方案还是值得的。您甚至可以以包装类的形式在站点中实现所需的身份验证,并且可以替换具体的登录系统而无需更改该实现。