放大 Auth.signIn() ClientMetadata 未发送到 Lambda 触发器

Amplify Auth.signIn() ClientMetadata not sent to Lambda Trigger

我们正在将我们的身份验证转移到 Cognito,并且需要更改我们从 Cognito 获得的令牌。我们正在使用 Pre Token Generation Lambda 触发器来完成此操作。我们还使用 Amplify 的 Auth 库。但是,我无法访问我们使用 Auth.signIn().

发送的 clientMetadata

在前端我们有:

const user = await Auth.signIn(username, password, { metadataKey: metadataValue });

看来请求已正确发送,因为在网络选项卡上的请求负载中我们有:

{
  AuthFlow: ...,
  AuthParameters: ...,
  ClientId: ...,
  ClientMetadata: { metadataKey: metadataValue }
}

在 lambda 函数中,我只是将事件记录到控制台:

exports.handler = async (event, context, callback) => {
  console.log('Event:', event)
  callback(null, event)
}

在 AWS Cloundwatch 日志中,每次我们从应用程序登录时都会记录事件(因此一切似乎都已正确设置),但事件不包括 clientMetadata 属性 作为 event.request.

的一部分

所以最终,一切正常,没有错误或类似的事情,我们从 Cognito 取回了我们的令牌,但是在 Lambda 函数中找不到 clientMetadata,阻止我们在 Lambda 中执行必要的逻辑功能来调整我们的代币。

链接:

如有任何帮助,我们将不胜感激。

更新:

这似乎是因为我们正在使用身份验证流程“USER_PASSWORD_AUTH”。这个流程是顺利的用户迁移所必需的,这就是我们使用它的原因,但它似乎忽略了我们发送的 clientMetadata。

尝试在执行 Auth.signIn 之前使用 Auth.configure 设置元数据值。一方面,登录事件看起来不像是令牌前 lambda 触发器,这解释了为什么未传递元数据。我很欣赏这不是特别直观。也就是说,另一方面,假设在作为刷新的一部分生成令牌时您将需要访问相同的元数据值,那么您可能无论如何都需要涵盖其他非初始登录事件。使用 Auth.configure 看起来对两者都有好处。

使用“USER_PASSWORD_AUTH”流时,请求中省略了 clientMetadata(不确定这是错误还是预期行为)。改回“USER_SRP_AUTH”解决了这个问题,客户端元数据按预期出现在请求中。