Как аутентифицировать вызовы API с помощью Cognito с помощью Facebook? - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу аутентифицировать пользователей, используя Cognito, с возможностью использовать Facebook.Пользователь может подписывать / подписывать, используя любую из этих опций.

Я создал Cognito User Pool и Cognito Federated Identity, а также создал приложение Facebook для аутентификации.И пользовательский пул, и приложение Facebook подключены к федеративному удостоверению.

Когда я подписываюсь и позже аутентифицирую Cognito User через Cognito User Pool, тогда Cognito возвращает accessToken, который я сохраняю в localStorage спереди и использую всякий раз, когда это необходимо для аутентификации.

У меня есть /authenticate конечная точка (экспресс), которая принимает имя пользователя и пароль и возвращает accessToken, если все прошло хорошо.Всякий раз, когда я выполняю вызов API, требующий авторизации, я отправляю accessToken, который у меня есть, в локальное хранилище.Это более или менее так:

// POST user/authenticate
const authenticationData = {
  Username: username,
  Password: password
}

authenticationDetails = new AuthenticationDetails(authenticationData)

const userData = {
  Username: username,
  Pool: userPool()
}
cognitoUser = new CognitoUser(userData)

cognitoUser.authenticateUser(authenticationDetails, {
  onSuccess: (res) => resolve(res), // here I get accessToken
  onFailure: (err) => {
    console.log('[authenticateUser error]', err)
    reject(err)
  },
//...

Однако

Когда я пользуюсь Facebook, я не получаю accessToken, который я мог бы использовать таким же образом.Я получаю accessToken из Facebook через FB.login, я передаю его Cognito для аутентификации, а затем я не знаю, что делать, потому что не могу получить токен, который можно использовать для аутентификации вызовов API, требующих Cognito Authentication.

Вот что я делаю:

await window.FB.login((response) => { 
  props.userFacebookSignIn(response)
})
// ...

call(foo, 'users/facebook_sign_in', { accessToken: payload.facebookAccessToken })
// ...

// users/facebook_sign_in
AWS.config.region = config.AWSRegion
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: 'foo',
  Logins: {
    'graph.facebook.com': facebookAccessToken
  }
})

AWS.config.credentials.get((err) => {
  // Here I get no errors, I presume that I have logged Facebook user in 
  const accessKeyId = AWS.config.credentials.accessKeyId
  const secretAccessKey = AWS.config.credentials.secretAccessKey
  const sessionToken = AWS.config.credentials.sessionToken
  // here I can do stuff probably, 
  // but I would like to receive token that would allow me to do stuff, 
  // rather than context I can do stuff in
})

Пока я все это делаю, у меня возникает ощущение, что разработчики в AWS внедрили Cognito в качестве решения веб-интерфейса, а не что-то, что будет использоваться вбэкенд.Поправьте меня, если я ошибаюсь.

Тем не менее, я хотел бы иметь возможность аутентифицировать вызовы API, используя Cognito и Facebook взаимозаменяемо в промежуточном ПО Express.

Возможно ли это?Спасибо.

Ответы [ 2 ]

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

Я решил использовать oAuth.

Вот быстрый и грязный взгляд на то, как это делается

В AWS Cognito

1) Настройка CognitoПул пользователей.Добавить Клиент приложения Сохранить Идентификатор клиента приложения & Секрет клиента приложения как COGNITO_CLIENT_ID и COGNITO_CLIENT_SECRET

2) Перейти к Федерация> Поставщики удостоверений и добавьте свой идентификатор приложения Facebook и секрет приложения (оба вы найдете на панели приложений Facebook)

3) Перейдите на Интеграция приложений> Настройки клиента приложения нажмите «Выбрать все»,установите URL обратного вызова , мой localhost: 5000 / facebook и выберите Код авторизации и Разрешенные области OAuth (сохраните области вскажем: COGNITO_SCOPES)

4) Теперь перейдите к Интеграция приложений> Имя домена и введите свой пользовательский домен;скажем example-app-debug так что это: https://example -app-debug.auth.us-east-1.amazoncognito.com

Вот и вседля Cognito

нет части Facebook

5) Настройки> Основные добавить пример-app-debug.auth.usuth.us-east-1.amazoncognito.com к вашим доменам приложений - Сохранить изменения

6) В Facebook Войти> Настройки в Действительные URI перенаправления OAuth добавить этот URL: https://example -app-debug.auth.us-east-1.amazoncognito.com / oauth2 / idpresponse и Сохранить изменения

и код

В браузере перенаправьте пользователя на этот URL при входе в систему w.Нажата кнопка Facebook:

window.location.href =
  `https://example-app-debug.auth.us-east-1.amazoncognito.com/oauth2/authorize` +
    `?identity_provider=Facebook` +
    `&redirect_uri=http://localhost:5000/facebook` +
    `&response_type=code` +
    `&client_id=${COGNITO_CLIENT_ID}` +
    `&scope=${COGNITO_SCOPES}`

этот звонок должен вернуться к вам с кодом, например: http://localhost:5000/facebook?code=foo-bar-code Отправьте этот код на ваш бэкэнд.

В бэкэнде сделайте следующее:

const axios = require('axios')
const url = `` +
`https://${COGNITO_CLIENT_ID}:${COGNITO_CLIENT_SECRET}` + 
`@example-app-debug.auth.us-east-1.amazoncognito.com/oauth2/token` +
`?grant_type=authorization_code` + 
`&code=foo-bar-code` + // <- code that came from Facebook
`&redirect_uri=http://localhost:5000/facebook` +
`&client_id=${COGNITO_CLIENT_ID}`

const response = await axios.post(url) 
// response should have access_token, refresh_token and id_token in data

Вы отправляете access_token, refresh_token и id_token обратно во внешний интерфейс и сохраняете их в локальном хранилище и используете их для аутентификации и завершения.

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

Я использовал федеративную идентификацию для единого входа Salesforce, но я думаю, что шаги будут такими же.После аутентификации с фейсбуком вы получите и id_token от них в ответ.Вы должны передать это как параметр в методе getId :

var params = {
  IdentityPoolId: 'STRING_VALUE', /* required */
  AccountId: 'STRING_VALUE',
  Logins: {
    '<IdentityProviderName>': 'STRING_VALUE',
    /* 'graph.facebook.com': ... */
  }
};
cognitoidentity.getId(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

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

response = client.get_credentials_for_identity(
    IdentityId='string',
    Logins={
        'string': 'string'
    },
    CustomRoleArn='string'
)

Это, наконец, даст вам временный ключ доступа, секретный ключ и ключ сеанса, которые вам нужны.

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