Простой GetItem с ctx.identity.username возвращает null

Я использую AppSync с IAM auth с DynamoDB resolver и Cognito. Я пытаюсь сделать следующее.

{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username)
    }
}

Предполагается, что $ctx.identity.username содержит userId, сгенерированный Cognito, и я пытаюсь использовать его для получения текущих пользовательских данных.

На стороне клиента я использую AWS Amplify, который говорит мне, что я в настоящее время зарегистрирован:

this.amplifyService.authStateChange$.subscribe(authState => {
  if (authState.state === 'signedIn') {
    this.getUserLogged().toPromise();
    this._isAuthenticated.next(true);
  }
});

getUserLogged — это Apollo query, который должен возвращать пользовательские данные.

Что я пробовал:

  • Если я оставлю это так, getUserLogged вернет null.
  • Если я заменю в резолвере $util.dynamodb.toDynamoDBJson($ctx.identity.username) известным userId вот так $util.dynamodb.toDynamoDBJson("b1ad0902-2b70-4abd-9acf-e85b62d06fa8"): Работает! Я получаю эти пользовательские данные.
  • Я пытался использовать тестовый инструмент на странице распознавателя, но он дает только поддельные данные, поэтому я не могу на это полагаться.

Я сделал ошибку? На мой взгляд, все выглядит хорошо, но я что-то упускаю?

Могу ли я ясно видеть, что содержит $ctx.identity?


person Tom    schedule 08.07.2018    source источник


Ответы (1)


Вы можете использовать $ctx.identity.cognitoIdentityId для идентификации пользователей Cognito IAM: https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#aws-appsync-resolver-context-reference-identity

Вы можете увидеть содержимое $ctx.identity, создав преобразователь Lambda и зарегистрировав событие, или создав локальный преобразователь и вернув входные данные, которые получает шаблон сопоставления: https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-local-resolvers.html

Мой cognitoIdentityId выглядит так: eu-west-1:27ca1e79-a238-4085-9099-9f1570cd5fcf

person Mikael Lindlöf    schedule 08.07.2018
comment
Хорошо. Я могу попробовать, но вы уверены, что $ctx.identity.cognitoIdentityId не привязан к устройствам? Что делать, если этот пользователь приходит с другим устройством. Будет ли он иметь такое же значение в $ctx.identity.cognitoIdentityId? Что, если он захочет войти в систему с Twitter последним. Будет ли такое же значение в $ctx.identity.cognitoIdentityId? Спасибо за помощь @mikuz. - person Tom; 08.07.2018
comment
В контекстной ссылке рекомендуется использовать cognitoIdentityId для идентификации пользователей из Cognito Federated Identities. Я не вижу доказательств его привязки к устройству, но вы можете проверить эту гипотезу. Подключение входа в Twitter к входу в пулы пользователей? Я не думаю, что это то, что поддерживает Federated Identities. Конечно, вы можете разработать систему для подключения логинов от двух провайдеров (для этого вам, вероятно, потребуется использовать преобразователи Lambda). - person Mikael Lindlöf; 08.07.2018
comment
Кажется, что cognitoIdentityId недоступен в Cognito триггерах. В настоящее время я использую триггер для хранения уникального идентификатора пользователя, сгенерированного Cognito. Идентификатор, который я могу использовать в своих преобразователях. Я потерялся. - person Tom; 08.07.2018
comment
Этот ответ должен помочь вам в совместном использовании пользователя Cognito UserPools и пользователя IAM Federated Identities stackoverflow.com/a/50109477/1207523 - person Mikael Lindlöf; 08.07.2018
comment
Итак, я должен использовать функцию Lambda, чтобы получить автора из каждого сделанного запроса? - person Tom; 08.07.2018
comment
Не уверен, что вы имеете в виду. В этом ответе я описываю систему, в которой все пользовательские данные (UserPool и Federated Identities) сохраняются в элементе DynamoDB во время входа в систему. В GraphQL вы можете получить эти данные в любом запросе, используя преобразователь DynamoDB в поле author. - person Mikael Lindlöf; 08.07.2018
comment
Давайте продолжим обсуждение в чате. - person Tom; 08.07.2018