我需要构建基本的“ 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作为存储机制吗?还是我很傻?
答案 0 :(得分:1)
AWS DynamoDb似乎是您最好的选择,它通常用于此类用例。使用它的一些好处:
答案 1 :(得分:0)
Cognito UserAttributes用于存储有关用户的信息。然后可以使用AWS Cognito SDK从客户端读取此信息,或者仅通过在客户端解码idToken
即可读取此信息。您添加的每个自定义属性都将在客户端可见。
自定义属性的另一个缺点是:
我个人使用过自定义属性,并且操纵它们的界面也不是很好。但这只是个人想法。
如果您要存储此信息,并且不依赖DynamoDB,则可以使用Amazon Cognito Sync。除了该服务之外,它还为客户提供了许多很棒的功能,您可以将它们整合到您的应用中。