以前,当我们仅使用Cognito用户池启动项目时,我创建了很多解析器,并通过Cognito用户池数据进行了验证,例如:
#if( $ctx.identity.claims["custom:role"] == "admin" )
...some code...(get data, invoke lambda, e.t.c.)
#else
$utils.unauthorized()
#end
但是后来我们需要其他授权提供者(Facebook,Google等)。因此,我们迁移到了cognitoIdentityId,但是在AppSync解析器中从Cognito用户池中获取用户数据时出现了问题。
在AWS Lambda中,我found由cognitoIdentityAuthProvider提供的Cognito用户池ID,可以获取为UserAttributes
的Cognito用户属性,请参见以下代码:
...
...
const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({
apiVersion: '2016-04-18',
});
const getCognitoUserPoolId = (authProvider) => {
const parts = authProvider.split(':');
return parts[parts.length - 1].slice(0, -1);
};
// cognitoIdentityAuthProvider, which we pass as an parameter($ctx.identity.cognitoIdentityAuthProvider) from the AppSync resolver
const SUB = getCognitoUserPoolId(cognitoIdentityAuthProvider);
const params = {
UserPoolId: COGNITO_USER_POOL_ID,
Username: SUB,
};
try {
const { UserAttributes } = await cognitoidentityserviceprovider.adminGetUser(params).promise();
...
...
} catch (error) {
return error;
}
问题是如何使用AppSync解析器中的cognitoIdentityId从Cognito用户池中获取数据?还是还有其他选择? 希望我不必为每个解析器创建单独的lambda吗?
答案 0 :(得分:4)
我假设您正在使用AWS_IAM作为GraphQL API上的授权类型,并且您正在通过Cognito联合身份联合Cognito用户池用户以获取用于调用GraphQL API的临时AWS凭证。
目前,联合用户信息在$ context.identity对象中不可用。解决此问题的方法是您发布以使用lambda检索它,然后通过使用管道解析器在解析器中进一步使用它。
我是AppSync小组的成员,我们过去曾听到过此功能请求,因此我将代表您为它+1。