如何从 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,
},
};
}
在 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,
},
};
}