我是否应该将失败的登录尝试存储在AWS Cognito或Dynamo DB中?

时间:2019-07-17 15:02:19

标签: amazon-web-services aws-lambda amazon-cognito

我需要构建基本的“ 3次失败的登录尝试,并且您的帐户被锁定”功能。该项目使用AWS Cognito进行身份验证,并且Cognito PreAuth和PostAuth触发器运行Lambda函数看起来像它们将在这里有所帮助。

因此,基本流程是在PreAuth lambda中增加一个计数器,检查该计数器并在其中阻止登录,或者在PostAuth lambda中重置该计数器(这样成功的登录不会最终将用户锁定)。本质上可以归结为:

PreAuth Lambda

if failed-login-count > LIMIT:
    block login
else:
    increment failed-login-count

PostAuth Lambda

reset failed-login-count to zero

现在,我正在使用专用的DynamoDB表存储给定用户的登录失败次数。目前,这似乎工作正常。 然后我认为在Cognito中使用自定义属性(使用CognitoIdentityServiceProvider.adminUpdateUserAttributes)会更整洁,这样我就可以丢弃DynamoDB表。

但是,在阅读https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-dg.pdf标题为“配置用户池属性”的部分中指出:

  

属性是可帮助您识别单个用户的信息,例如姓名,电子邮件和电话号码。并非有关用户的所有信息都应存储在属性中。例如,应将频繁更改的用户数据(例如使用情况统计信息或游戏分数)保存在单独的数据存储中,例如Amazon Cognito Sync或Amazon DynamoDB。

鉴于每次尝试登录时计数器都会改变,因此文档似乎表明我不应该这样做...

但是有人可以告诉我为什么吗?还是这样做会有负面影响? 据我所知,Cognito计费完全基于存储(即用户数量),而不是操作,而Dynamo则对读/写/存储收费。 难道仅仅是AWS不想让人们滥用Cognito作为存储机制吗?还是我很傻?

2 个答案:

答案 0 :(得分:1)

AWS DynamoDb似乎是您最好的选择,它通常用于此类用例。使用它的一些好处:

  • 您可以为每次登录尝试存储单独的记录,并提供所需的尽可能多的信息,例如ip地址,位置,用户代理等。您还可以添加日期时间,以供预身份验证Lambda使用,以按时间范围进行查询例如最近30分钟内的尝试失败
  • 您不需要管理表格,因为您可以设置TTL for DynamoDb record,以便在指定时间后自动删除记录。
  • 您也可以archive items in S3

答案 1 :(得分:0)

Cognito UserAttributes用于存储有关用户的信息。然后可以使用AWS Cognito SDK从客户端读取此信息,或者仅通过在客户端解码idToken即可读取此信息。您添加的每个自定义属性都将在客户端可见。

自定义属性的另一个缺点是:

  • 您只能设置25个值
  • 将它们添加到用户池后就无法删除或更改。

我个人使用过自定义属性,并且操纵它们的界面也不是很好。但这只是个人想法。

如果您要存储此信息,并且不依赖DynamoDB,则可以使用Amazon Cognito Sync。除了该服务之外,它还为客户提供了许多很棒的功能,您可以将它们整合到您的应用中。