Я создаю приложение для социального чата, и первоначально у меня был пул Cognito, который был объединен с Google / Facebook.Я хранил пользовательские данные, основанные на подпрограмме user для пользователей cognito и идентификаторе личности для google / facebook.Затем в моих средствах разрешения лямбда-gql я бы проходил аутентификацию через AWS-sdk:
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: process.env.IDENTITY_POOL_ID,
Logins: {
[`cognito-idp.us-east-1.amazonaws.com/${
process.env.COGNITO_USERPOOL_ID
}`]: Authorization,
},
});
Поскольку все пользователи равны и мне не нужны детальные элементы управления доступом к aws-ресурсам, кажется,вместо этого было бы предпочтительнее вместо этого обрабатывать всю аутентификацию через пул пользователей и полностью избавляться от пула идентификаций.
Например, если я хочу заблокировать учетную запись пользователя, мне кажется, что сначала мне нужно будет найти провайдера по идентификатору, а затем выполнить другое действие в зависимости от провайдера.
Итак, мои вопросы: 1. Возможно ли это вообще?- https://github.com/aws-amplify/amplify-js/issues/565 - https://www.reddit.com/r/aws/comments/92ye5s/is_it_possible_to_add_googlefacebook_user_to/
Кажется, что есть много путаницы, и документы aws менее ясны, чем обычно (что не так уж много по моему мнению).https://docs.aws.amazon.com/cognito/latest/developerguide/authentication.html
Кажется, что есть способ сделать это.Я следовал приведенному выше руководству и получаю сообщения об ошибках с конечной точкой размещенного пользовательского интерфейса, но это, вероятно, на мне (https://forums.aws.amazon.com/thread.jspa?threadID=262736). Однако я не хочу, чтобы конечная точка размещенного пользовательского интерфейса, я хотел бы, чтобы пользователи cognito входили через мою пользовательскую формуа затем в социальных сетях пользователи нажимают кнопку «продолжить с fb» и автоматически заполняют мой пул пользователей.
Затем замените приведенный выше код следующим кодом для проверки всех пользователей:
const validate = token => new Promise(async (resolve) => {
const {
data: { keys },
} = await axios(url);
const { sub, ...res } = decode(token, { complete: true });
const { kid } = decode(token, { header: true });
const jwk = R.find(R.propEq('kid', kid))(keys);
const pem = jwkToPem(jwk);
const response = res && res['cognito:username']
? { sub, user: res['cognito:username'] }
: { sub };
try {
await verify(token, pem);
resolve(response);
} catch (error) {
resolve(false);
}
});
Если это возможно, каков правильный механизм, который заменил бы следующее:
Auth.federatedSignIn('facebook', { token: accessToken, expires_at }, user)
.then(credentials => Auth.currentAuthenticatedUser())
.then((user) => {
onStateChange('signedIn', {});
})
.catch((e) => {
console.log(e);
});
Из того, что я видел, похоже, не существует метода с Amplify для этого,Есть ли способ сделать это с помощью aws-sdk?Как насчет сопоставления обратного вызова из API Facebook для создания клиентской части Cognito пользователя?Кажется, что это может стать довольно грязным.
Если нет механизма для выполнения вышесказанного, должен ли я объединять пользователей Cognito с социальными входами?
И что потом использовать для идентификации пользователей в моей базе данных?В настоящее время я использую имя пользователя и саб для cognito и id для федеративных пользователей.Извлечение сабвуфера со стороны токена Auth на стороне сервера, а затем на клиенте:
Auth.currentSession()
.then((data) => {
const userSub = R.path(['accessToken', 'payload', 'sub'], data);
resolve(userSub);
})
.catch(async () => {
try {
const result = await Auth.currentCredentials();
const credentials = Auth.essentialCredentials(result);
resolve(removeRegionFromId(credentials.identityId));
} catch (error) {
resolve(false);
}
});
Если кто-нибудь может дать подробный авторитетный ответ, который мне еще предстоит найти в отношении использования пользователя cognitoбассейны вместо федерации это было бы здорово.В противном случае очень хотелось бы получить общее представление о правильном подходе.