AWS Cognito 和 Amplify:刷新会话时不发送 clientMetadata

bhm*_*bhm 10 javascript reactjs amazon-cognito aws-amplify

我们有一个使用 AWS Cognito 和 Amplify 的 React 客户端(“aws-amplify”:“1.1.40”)。

当用户登录时,我们希望向 Cognito 发送一些额外数据,以供“预令牌生成”触发器使用。我们通过向Auth.signIn 函数调用添加一个clientMetadata ({"metadataKey1": "metadataValue1"}) 对象来做到这一点:

Auth.signIn(auth.email, auth.password, {"metadataKey1": "metadataValue1"})
    .then(response => {
        // Sign in OK
    })
    .catch(error => {
        // Something went wrong
    });
Run Code Online (Sandbox Code Playgroud)

这按预期工作,Cognito“预令牌生成”lambda 可以"metadataKey1"从请求中的 clientMetadata 中提取。

这是我们的问题开始的地方:

成功登录后,AWS Amplify 会自动刷新会话。此会话刷新不是由我们的代码明确完成的,并且未设置在登录期间使用的 clientMetadata 对象。这当然意味着对 Cognito 的自动会话刷新请求不包含 clientMetadata,这反过来意味着 Cognito“预令牌生成”lambda 无法"metadataKey1"从请求中的 clientMetadata 中提取(因为它不存在)。

我们对代码进行了调试,发现对 Cognito 的自动请求发生在@aws-amplify\auth\node_modules\amazon-cognito-identity-js\es\CognitoUser.js#1249, CognitoUser.prototype.refreshSession。refreshSession 函数可以接收 clientMetadata 对象,但是在调试代码时,clientMetadata 对象始终是undefined(这是有道理的;我们没有明确设置它,而且 Amplify 代码似乎没有存储/使用我们在登录期间设置的 clientMetadata)。

我们需要什么帮助:

  1. 我们做得还不够吗?我们是否必须在我们的代码中做一些其他的事情来确保 clientMetadata 对象在每个对 Cognito 的请求上发送,即使是我们的代码没有明确完成的请求?
  2. 我们做错了吗?目标是确保我们可以将我们自己的数据发送到 Cognito 的每个请求。除了使用 clientMetadata 对象,还有其他方法可以做到这一点吗?

真的很感激这方面的任何帮助!

Edg*_*ski 1

根据API 参考,该值作为以下触发器的ClientMetadata输入传递给函数:

  • 预注册
  • 预认证
  • 用户迁移