【发布时间】:2018-11-13 19:09:52
【问题描述】:
我正在开发一个自定义无密码身份验证来登录 Cognito 用户池。我将描述我正在尝试实现的内容,以防万一有什么愚蠢的。我希望用户输入他们的电子邮件地址,然后通过电子邮件收到一个神奇的登录链接,当他们点击该链接时,将被带回网站并登录。
这使用自定义身份验证 lambda 函数来定义/创建具有基于时间的密码的质询,并通过电子邮件将其发送给用户。我有几个问题:
问题 1)
当用户返回代码时,他们可能不在同一个浏览器/设备中,当然也不会在同一个选项卡中,因此他们没有会话,这意味着我需要再次调用 cognitoUser.initiateAuth。这将再次通过定义/创建挑战 lambda,因此即使此时用户来自电子邮件链接,因此已经发送了第二封电子邮件。注意:创建挑战时,会话 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(...) 调用发送自定义元数据,并让它在我的 Define/Create Challenge lambda fns 中可用。
【问题讨论】:
-
你解决过这个问题吗?我的情况几乎完全一样。
-
有同样的问题。通过使用 amplify.Auth.signIn 将其作为“validationData”或“clientMetadata”传递,lambda 中的“clientMetadata”参数不存在。
-
不幸的是,AWS Cognito 没有将 clientMetadata 传递给 DefineAuthChallenge 或 CreateAuthChallenge,请参阅 the InitiateAuth docs here, under Request Parameters。虽然在 createAuthChallenge 文档中提到了 clientMetadata,但这是一种误导。
标签: amazon-web-services authentication amazon-cognito cognito