Шаги по интеграции AWS Cognito как с Google, так и с пользовательским входом в React

Привет. Может ли кто-нибудь сообщить мне, как интегрировать AWS cognito как для пользовательского входа (имя пользователя/пароль), так и для входа в Google? я могу заставить пользовательский логин работать без проблем. Я смог настроить пул пользователей без каких-либо проблем. Я просто блуждаю по изменениям на стороне клиента.

Я использую пакеты amazon-cognito-identity-js и aws-sdk.

Ниже приведен фрагмент кода, который я использую. здесь я использую параметр для определения аутентификатора. Было бы здорово, если бы кто-нибудь из вас мог дать какой-либо отзыв. Спасибо.

export function getAwsCredentials(userToken, type) {
  let authenticator = '';
  

  if (type == 'CUSTOM') {
    authenticator = `cognito-idp.${config.cognito
      .REGION}.amazonaws.com/${config.cognito.USER_POOL_ID}`;
  }
  else if (type == 'GOOGLE') {
    authenticator = 'accounts.google.com';
  }

  AWS.config.update({ region: config.cognito.REGION });

  AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: config.cognito.IDENTITY_POOL_ID,
    Logins: {
      [authenticator]: userToken

    }
  });

  return AWS.config.credentials.getPromise();
}


person Roshan Fernando    schedule 23.10.2017    source источник
comment
Этот код выглядит хорошо для меня. Вам интересно, как получить userToken от Google? Или вы получаете токен Google, который не нравится Cognito? Безопасно ли предположить, что у вас уже настроен пул федеративных удостоверений в дополнение к вашему пулу пользователей?   -  person Mike Patrick    schedule 24.10.2017
comment
Да, я создал пул федеративных удостоверений. Итак, когда придет токен, могу ли я просто добавить его в качестве логина? Любая идея, как определить, как пользователь вошел в систему (из google или custom)?   -  person Roshan Fernando    schedule 24.10.2017


Ответы (1)


Когда дело доходит до вашего федеративного пула удостоверений, вы действительно можете обращаться со всеми токенами одинаково. Вам нужно только изменить [authenticator] на карте входа в систему.

Предположительно, код, который вызывает вашу функцию getAwsCredentials, должен знать, откуда взялся токен, и может передать параметр, как вы делаете выше.

Я хотел упомянуть, что я не думаю, что это обязательно ужасный подход. Я мог бы передать значение [authenticator] напрямую вместо type, но это относительно незначительная вещь. Моя главная мысль заключается в том, что может быть, оставить ответственность за знание того, откуда взялся токен, с вызывающим кодом, а не с вашей вызываемой функцией.

Определение поставщика удостоверений с помощью токена

Есть, конечно, одинаково допустимые подходы, которые могут захотеть или должны вытащить поставщика удостоверений из самого токена.

Когда вы напрямую интегрируетесь с Google, вы получаете токен от Google, который затем передаете в Cognito ( как в вашем коде выше). Если вы расшифруете жетон, вы найдете

"iss": "accounts.google.com",

где-то там.

Точно так же, когда вы интегрируетесь напрямую с вашим пулом пользователей, токен, который вы получаете из своего пула пользователей (который вы позже предоставляете пулу удостоверений), содержит что-то вроде:

"iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx",

Таким образом, вы можете узнать, как пользователь вошел в систему, проверив его токен.

Примечание о размещенном на Cognito пользовательском интерфейсе

Если вы используете размещенный пользовательский интерфейс Cognito для входа в Google, вы получите access_token и id_token от Cognito (через перенаправление). В этом случае все токены поступают из одного и того же места (Cognito), а это означает, что вы не можете полагаться на какой-либо вызывающий код, чтобы узнать, кто является настоящим поставщиком удостоверений. .

В этом случае вам нужно взломать токены, если вашему приложению важно, кто такой IDP. Эта часть id_token - это то, что вам, вероятно, нужно:

  "identities": [
    {
      "userId": "100000000000000000000",
      "providerName": "Google",
      "providerType": "Google",
      "issuer": null,
      "primary": "true",
      "dateCreated": "1507749926267"
    }
  ],
  "token_use": "id",
  "auth_time": 1509303233,
  "name": "Your User",
  "exp": 1509306833,
  "iat": 1509303233,
  "email": "[email protected]"
person Mike Patrick    schedule 29.10.2017
comment
Спасибо Майк! Я проверю вашу точку зрения. Я не использую размещенный пользовательский интерфейс Cognito - person Roshan Fernando; 30.10.2017