Как использовать только `ctx.identity.cognitoIdentityId` для получения связанных пользовательских данных Cognito User Pool в AppSync Resolver? - PullRequest
0 голосов
/ 16 февраля 2019

Ранее, когда мы начинали наш проект только с Cognito User Pool, я создал множество распознавателей с проверкой по данным Cognito User Pool, например:

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

Но позже нам понадобились другие поставщики авторизации (Facebook,Гугл и тд).Поэтому мы перешли на cognitoIdentityId, но возникла проблема с получением пользовательских данных из пула пользователей Cognito в решателях AppSync.В AWS Lambda я нашел идентификатор пула пользователей Cognito от cognitoIdentityAuthProvider и могу получить атрибуты пользователя 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;
}

Вопрос в том, как получитьданных из пула пользователей Cognito с использованием cognitoIdentityId в распознавателях AppSync? Или есть другие варианты? Надеюсь, мне не нужно создавать отдельную лямбду для каждого резольвера?

1 Ответ

0 голосов
/ 22 февраля 2019

Я предполагаю, что вы используете AWS_IAM в качестве типа авторизации для вашего API GraphQL и вы объединяете пользователя пула Cognito через федеративные удостоверения Cognito для получения временных учетных данных AWS, которые вы используете для вызова вашего API GraphQL.

В настоящее время информация о федеративном пользователе недоступна в объекте $ context.identity.Обходной путь для этого - то, что вы опубликовали, чтобы извлечь его с помощью лямбды и использовать его в своем преобразователе, например, с помощью преобразователей конвейера.

Я в команде AppSync, и мы слышали этот запрос функции в прошломпоэтому я буду +1 для вас от вашего имени.

...