Я создаю богатый интерфейс для AWS S3, используя AWS SDK. Он отлично работает с жесткими идентификаторами IAM в конфигурации AWS SDK, но я хотел бы предоставить доступ к конечному пользователю через AWS Cognito.Как получить учетные данные на AWS? Должен ли я использовать AWS Cognito SDK или AWS SDK?
Как я могу получить учетные данные для пользователей, которых я создал в моем пуле пользователей Cognito?
Документация AWS очень неясна. Есть примеры, которые я видел с помощью SDK AWS, и примеры, которые я видел, говорят, что вам нужен другой AWS Cognito SDK. Какая документация является правильной?
Для этого конкретного проекта я НЕ, желающий использовать сторонние федеративные удостоверения вообще.
ОБНОВЛЕНИЕ
Проблема состоит в два раза. Понимание терминологии и правильная настройка Cognito - это первая часть. Спасибо Bruce0 за то, что вы меня туда запустили. Вторая часть - часть javascript. Оказывается, вам нужны две отдельные библиотеки для аутентификации пользователей Cognito исключительно из javascript.
Это решение, с которым я столкнулся. Если он выглядит чужим для вас, убедитесь, что вы изучили ваш es6 с обещаниями/асинхронным/ожиданием. Чтобы запустить его в узле, вам просто нужно предварительно обработать его, используя Babel, предустановленный es2015, предустановленный этап-2 и плагин babel-transform-runtime. Если вы хотите запустить его в браузере, вам, вероятно, понадобится использовать babel-loader с webpack (который, как известно, сложно настроить, просто предупреждение).
import AWS from 'aws-sdk/global';
import S3 from 'aws-sdk/clients/s3';
import {
AuthenticationDetails,
CognitoUser,
CognitoUserPool,
} from 'amazon-cognito-identity-js';
const REGION = 'some-string-value';
const USER_POOL_ID = 'some-string-value';
const IDENTITY_POOL_ID = 'some-string-value';
const APP_CLIENT_ID = 'some-string-value';
const POOL_KEY = `cognito-idp.${REGION}.amazonaws.com/${USER_POOL_ID}`;
let Username = 'some-string-value';
let Password = 'some-string-value';
let authenticationDetails = new AuthenticationDetails({
Username,
Password
});
let userPool = new CognitoUserPool({
UserPoolId: USER_POOL_ID,
ClientId: APP_CLIENT_ID
});
let cognitoUser = new CognitoUser({
Username,
Pool: userPool
});
let skateboards = {
mfaRequired(codeDeliveryDetails) {
let mfaCode = prompt('MFA code is required!');
cognitoUser.sendMFACode(mfaCode, mfaRequired);
},
newPasswordRequired(userAttributes, requiredAttributes) {
delete userAttributes.email_verified; // it's returned but not valid to submit
let newPassword = prompt('A new password is required!');
cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, newPasswordRequired);
}
};
let updateAWSCreds = (jwtToken) => {
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: IDENTITY_POOL_ID,
Logins: {
[POOL_KEY]: jwtToken
}
});
};
let authenticateCognitoUser = async ({mfaRequired, newPasswordRequired} = skateboards) => {
return new Promise((resolve, reject) => {
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess(result) {
let jwtToken = result.getIdToken().getJwtToken();
updateAWSCreds(jwtToken);
resolve();
},
onFailure(err) {
reject(err);
},
mfaRequired,
newPasswordRequired
});
});
};
let doSomethingInS3ForExample = async() => {
await authenticateCognitoUser();
// now do your stuff
};
doSomethingInS3ForExample();
https://gist.github.com/sbussard/7344c6e1f56051da0758d1403a4343b1
Я бы не стал слишком много работать с aws-sdk на клиенте, так как это потребовало бы сделать секретный ключ AWS доступным на клиенте. Я бы либо пошел с cognito, либо aws sdk на бэкэнд, и использовал назначенные запросы на клиенте. – Guig
Единственный способ получить учетные данные в Cognito - создать федеративный пул идентификаторов. Методы cognitoIdentity и credentialsProvider - это способ получения учетных данных. Вам не нужно присваивать идентификаторам федерации федеративным пулам идентификаторов, но вам нужно иметь идентификатор (и те, которые существуют только в пуле).Таким образом, у вас будет cognitoUserPool в качестве единственного поставщика проверки подлинности в пуле федеративных идентификаторов (ничто не будет объединено), а роли IAM предоставляются (обычно аутентифицированные и не прошедшие проверку подлинности) этим пулом идентификаторов (но у вас может быть больше ролей) – Bruce0
@ Bruce0 действительно! это то, что я переживаю до сих пор. Когнито кажется действительно революционным. Ваша помощь очень ценится и, несомненно, положительно повлияет на миллионы людей в ближайшие месяцы, не считая пробелов;) – Stephen