如何仅使用`ctx.Identity.CognitoIdentityId`以获取AppSync解析器中的Cognito用



之前,当我们仅使用cognito用户池启动项目时,我创建了许多通过Cognito用户池数据验证的解析器,例如:

#if( $ctx.identity.claims["custom:role"] == "admin" )
...some code...(get data, invoke lambda, e.t.c.)
#else
  $utils.unauthorized()
#end

但后来我们需要其他授权提供商(Facebook,Google E.T.C。)。因此,我们迁移到cognitoidentityID,但是从AppSync解析器中的Cognito用户池获取用户数据存在问题。在AWS lambda中,我找到了CognitoIdentityAuthProvider的Cognito用户池ID,并且可以将Cognito用户属性作为UserAttributes参见下面的代码:

...
...
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?

我假设您正在使用AWS_IAM作为GraphQl API上的授权类型API。

目前,在$ contection.identity对象中,联合用户信息尚不可用。解决方法是您发布的方法,以使用lambda检索它,并使用管道固定器进行进一步的解决方案。

我在Appsync团队中,我们过去听过此功能请求,所以我代表您为您 1。

最新更新