Rob*_*phy 12 authentication amazon-web-services amazon-cognito cognito
我正在开发自定义无密码身份验证以登录 Cognito 用户池。我将描述我正在尝试实施的内容,以防万一。我希望用户输入他们的电子邮件地址,然后通过电子邮件收到一个神奇的登录链接,当他们点击该链接时,会被带回网站并登录。
这使用自定义 auth lambda 函数来定义/创建具有基于时间的密码的质询,并将其通过电子邮件发送给用户。我有几个问题:
问题 1)
当用户返回代码时,他们可能不在同一个浏览器/设备中,当然也不会在同一个选项卡中,因此他们没有会话,这意味着我需要再次调用 cognitoUser.initiateAuth。这将再次通过定义/创建挑战 lambdas,因此即使此时用户来自电子邮件链接,因此已经拥有代码,也会发送第二封电子邮件。注意:创建挑战时,会话 ID 在事件对象中不可用,而且我只阅读了这些会话仅持续了 3 分钟,我的基于时间的密码将持续约 15 分钟,所以我认为我不能包含会话电子邮件中的 ID。
问题 2)
您可以从几个地方(浏览器、Android 应用程序等)登录,我希望能够包含 url 或至少协议作为参数来控制电子邮件中发送的内容,例如,如果您在android 应用程序,那么您收到的电子邮件将是 myapp://login?code=xxx,如果您在网络上这样做,它将是https://example.com/login?code=xxx
如果我能找到某种方法将自定义元数据发送到 DefineChallenge 和 CreateChallenge lambda 使其出现在事件对象中,那么似乎我将能够实现这两个功能以正常工作。我认为将 ValidationData 添加到 AuthenticationDetails 对象会做到这一点,但该信息不会出现在 Lambda fns 的事件对象中。
我发现的解决方法是为每种情况创建一个新的客户端 ID - 一个用于启动身份验证,一个用于兑换令牌,并为每个不同的协议重复。但这很快就会有很多客户端 ID - 维护起来很麻烦而且很笨拙。
所以 tl;dr 是:我想从 JS 中的 cognitoUser.initiateAuth(...) 调用发送自定义元数据,并在我的定义/创建挑战 lambda fns 中提供它。
您可以将身份验证过程拆分为多个自定义身份验证质询。这允许通过质询响应作为客户端元数据提供自定义身份验证状态。
身份验证会话状态必须保留在数据库中才能在设备之间共享。
您的自定义登录流程可能有两个挑战步骤:第一个提示输入身份验证类型,第二个提示输入密码。“创建身份验证挑战”Lambda 采取的操作将取决于身份验证类型。如果身份验证类型为“电子邮件”,则会生成密码和魔术链接,存储在 DynamoDB 中并通过电子邮件发送。如果身份验证类型为“MagicLink”,则从 DynamoDB 加载密钥。单击 Magic 链接将启动新的身份验证会话并自动提供所有挑战答案。
还有其他一些事情需要考虑:
| 归档时间: |
|
| 查看次数: |
1263 次 |
| 最近记录: |