Сохранение пользователей AWS Cognito в DynamoDB

Недавно я начал экспериментировать с AWS AppSync, но у меня возникли вопросы по AWS Cognito.

Я хотел бы, чтобы пользователи могли аутентифицироваться в Facebook, но мне нужны их изображение профиля, имя и адрес электронной почты в качестве данных для моих общедоступных профилей пользователей в моем приложении. До сих пор я заметил, что Cognito интегрируется с Facebook Auth, но он не разрешает доступ к пользовательской информации, и эта информация не сохраняется в таблице DynamoDB.

Мой вопрос: как я могу создать нового пользователя в DynamoDB, когда Cognito получает новый вход, или вернуть существующего пользователя / идентификатор, когда пользователь уже существует в базе данных.


person Rein Van Imschoot    schedule 18.12.2017    source источник


Ответы (3)


Несколько недель назад я пытался добиться того же.

Прочитав документацию в течение нескольких часов, я понял, что Cognito может не помочь нам в отношении данных, которые возвращаются из FB, или в том, как их сохранить.

В итоге я сделал следующее:

(1) Используя FB-SDK, извлеките пользовательские данные.

(2) Вызвал лямбда-функцию, которая сохранила эти данные (например, FB_id и т. Д.) В DynamoDB.

(3) Если пользователь снова вошел в систему, его FB_id (или адрес электронной почты) использовался для проверки записей DynamoDB для получения их данных.

Если Cognito может нам помочь, а я как-то упустил это, я хотел бы знать.

Удачного кодирования!

person nishkaush    schedule 18.12.2017
comment
Но что тогда делать для авторизации будущих запросов api? Cognito возвращает jwt, который вы можете добавить в качестве заголовка, но я думаю, что сложно управлять этим поведением с помощью динамо-машины? - person Rein Van Imschoot; 18.12.2017
comment
Насколько я понял, Cognito по-прежнему проходит весь процесс проверки с помощью FB, является ли предоставленный токен действительным и т. Д. Если Cognito возвращается и говорит, что он действителен, и возвращает мне jwt, я затем беру данные пользователя и обрабатываю его. мой собственный в DDB. - person nishkaush; 18.12.2017
comment
У вас есть фрагменты кода, которые я мог бы просмотреть? Это мне очень поможет. Спасибо за ответы! - person Rein Van Imschoot; 18.12.2017
comment
2019 год, и это по-прежнему лучший подход. Более того, если вам нужно обмениваться информацией между пользователями, например социальным приложением, очень сложно сделать информацию другого пользователя доступной для обнаружения, если данные хранятся в пуле пользователей Cognito. - person Luis Galvez; 04.06.2019

Вы можете использовать настраиваемые атрибуты и объединение пользователей из Facebook в ваш пользовательский пул для достижения этой цели. Вот шаги на высоком уровне, чтобы сделать это.

  • Сначала вам нужно будет определить настраиваемые атрибуты для информации профиля, которую вы хотите сохранить в каждом профиле пользователя.
  • Определите сопоставление атрибутов с свяжите настраиваемые атрибуты с атрибутами Facebook, которые вы хотите сохранить.
  • Создайте свое приложение, используя страницы, размещенные на Cognito и федерация, чтобы ваши пользователи могли входить в систему с помощью Facebook.

После этого при каждом входе нового пользователя в ваше приложение в вашем пуле пользователей создается новый пользователь со всеми атрибутами, которые были определены в сопоставлении атрибутов, и значениями, которые Cognito получает в токене Facebook. Ваше приложение получит эти значения атрибутов в IDToken, выданном после аутентификации, и вы сможете их использовать.

Кроме того, если вы хотите сохранить эти значения атрибутов вне профиля пулов пользователей Cognito, например, вашу собственную таблицу DynamoDB, вы можете настроить триггер PreSignUp в пуле, который будет вызываться для всех созданий новых пользователей. Вы можете экспортировать атрибуты пользователя из этого триггера в любую базу данных по вашему выбору.

Надеюсь это поможет.

person Chetan Mehta    schedule 20.12.2017

AWS AppSync позволяет получить доступ к информации в преобразователе GraphQL, которую вы можете сохранить в таблице DynamoDB. В вашем случае для данных, поступающих из профиля Facebook, вы можете передать это в качестве аргументов мутации GraphQL или в заголовке в AppSync, к которому вы затем можете получить доступ в преобразователе через $ctx.request.headers.NAME, где NAME - это имя вашего заголовка. Затем вы можете просто выбрать, какие атрибуты вы хотите записать в DynamoDB для этого пользователя как часть мутации. Дополнительная информация находится в справочном руководстве здесь: https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html

Поскольку вы также попросили сначала выполнить проверку, чтобы увидеть, находится ли пользователь уже в DDB, вы можете сначала просто выполнить проверку существования:

{
  "version": "2017-02-28",
  "operation": "PutItem",
  "key": {
    "userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username),
  },
  "attributeValues": $util.dynamodb.toMapValuesJson($ctx.args.input),
  "condition": {
    "expression": "attribute_not_exists(userId)"
  },
}

Это проверяет имя пользователя из пулов пользователей Cognito. Если бы вы использовали функцию Cognito Federated Identities, это было бы ctx.identity.cognitoIdentityId. Если запись уже существует, ответ, который вернется, скажет вам, что означает, что пользователь уже присутствует. Вы также можете преобразовать возвращенное сообщение в шаблоне сопоставления ответов, посмотрев на $ctx.result с помощью условного оператора и либо построив ответ JSON с нуля, либо используя один из методов $util.error() в приведенном выше руководстве.

Наконец, как вы упомянули, что у вас будут данные общедоступного профиля, вы можете отметить это в определенных записях для контроля. В AWS AppSync вы можете фильтровать ответы GraphQL по таким метаданным авторизации, как этот. У вас будет просто атрибут (он же столбец) в записи DynamoDB, помеченный как «общедоступный» или «частный». Тогда ваш шаблон ответа будет выглядеть так:

#if($context.result.public == 'yes')
    $utils.toJson($context.result)
#else
    $utils.unauthorized()
#end

Вы можете увидеть больше примеров здесь: https://docs.aws.amazon.com/appsync/latest/devguide/security-authorization-use-cases.html#public-and-private-records

person Richard    schedule 15.02.2018