如何仅使用`ctx.identity.cognitoIdentityId`来获取AppSync Resolver中的相关Cognito用户池用户数据?

时间:2019-02-16 14:36:34

标签: amazon-web-services amazon-cognito aws-appsync

以前,当我们仅使用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吗?

1 个答案:

答案 0 :(得分:4)

我假设您正在使用AWS_IAM作为GraphQL API上的授权类型,并且您正在通过Cognito联合身份联合Cognito用户池用户以获取用于调用GraphQL API的临时AWS凭证。

目前,联合用户信息在$ context.identity对象中不可用。解决此问题的方法是您发布以使用lambda检索它,然后通过使用管道解析器在解析器中进一步使用它。

我是AppSync小组的成员,我们过去曾听到过此功能请求,因此我将代表您为它+1。