Я хочу аутентифицировать пользователей, используя 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.
Возможно ли это?Спасибо.