如何从 lambda 函数中获取用户的 Amazon Cognito 身份 ID (user_identity_id)?

How to fetch Amazon Cognito Identity ID (user_identity_id) for the user from the lambda function?

在 Amplify 文档中,Storage/File access levels 部分下有一个段落指出:

Files are stored under private/{user_identity_id}/ where the user_identity_id corresponds to the unique Amazon Cognito Identity ID for that user.

如何从 lambda 函数中获取 user_identity_id?

对 lambda 的请求已获得授权,event.requestContext.authorizer.claims 对象可用,我可以看到用户数据,但看不到 user_identity_id。

编辑:现在我看到有一个字段 event.requestContext.identity.cognitoIdentityId,但值为 null。还是得想办法获取。

如果用户通过 AppSync 服务通过 graphql 访问 lambda,则会存储身份 event.identity.owner

这是我用来从事件中提取 user_identity_id 的一些打字稿代码。但是,用户并不总是直接调用 lambda sp user_identity 也可以基于 if 来自授权的 IAM 角色。

export function ownerFromEvent(event: any = {}): string {
  if (
    event.identity.userArn &&
    event.identity.userArn.split(":")[5].startsWith("assumed-role")
  ) {
    // This is a request from a function over IAM.
    return event.arguments.input.asData.owner;
  } else {
    return event.identity.owner;
  }
}

好的,所以没有正确的方法来映射 Cognito 身份 ID 和 Cognito 用户。有一个冗长的讨论 here where a couple of workarounds can be found. For now, I'm going to use this 解决方案,您可以指定自定义属性(很可能是子属性)作为文件夹名称,而不是 identity_id。

编辑:还有另一个可能有用的解决方案(在互联网上的某处找到,我验证它有效)

const AWS = require('aws-sdk')
const cognitoIdentity = new AWS.CognitoIdentity();

function getCognitoIdentityId(jwtToken) {
  const params = getCognitoIdentityIdParams(jwtToken);
  return cognitoIdentity
    .getId(params)
    .promise()
    .then(data => {
      if (data.IdentityId) {
        return data.IdentityId;
      }
      throw new Error('Invalid authorization token.');
    });
}

function getCognitoIdentityIdParams(jwtToken) {
  const loginsKey = `cognito-idp.${process.env.REGION}.amazonaws.com/${process.env.USERPOOLID}`;
  return {
    IdentityPoolId: `${process.env.IDENTITY_POOL_ID}`,
    Logins: {
      [loginsKey]: jwtToken,
    },
  };
}