1

Я создаю богатый интерфейс для 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

+0

Я бы не стал слишком много работать с aws-sdk на клиенте, так как это потребовало бы сделать секретный ключ AWS доступным на клиенте. Я бы либо пошел с cognito, либо aws sdk на бэкэнд, и использовал назначенные запросы на клиенте. – Guig

+1

Единственный способ получить учетные данные в Cognito - создать федеративный пул идентификаторов. Методы cognitoIdentity и credentialsProvider - это способ получения учетных данных. Вам не нужно присваивать идентификаторам федерации федеративным пулам идентификаторов, но вам нужно иметь идентификатор (и те, которые существуют только в пуле).Таким образом, у вас будет cognitoUserPool в качестве единственного поставщика проверки подлинности в пуле федеративных идентификаторов (ничто не будет объединено), а роли IAM предоставляются (обычно аутентифицированные и не прошедшие проверку подлинности) этим пулом идентификаторов (но у вас может быть больше ролей) – Bruce0

+0

@ Bruce0 действительно! это то, что я переживаю до сих пор. Когнито кажется действительно революционным. Ваша помощь очень ценится и, несомненно, положительно повлияет на миллионы людей в ближайшие месяцы, не считая пробелов;) – Stephen

ответ

4

Единственный способ получить полномочия в Cognito является создание федеративного удостоверения пула. Методы cognitoIdentity и credentialsProvider - это способ получения учетных данных.

Вам не нужно вводить идентификаторы федерации, чтобы использовать объединенный пул идентификаторов, но для получения учетных данных вам необходимо иметь идентификатор идентификатора (и только те, что существуют в пуле).

Таким образом, у вас будет cognitoUserPool в качестве единственного провайдера проверки подлинности в пуле федеративных идентификаторов (ничто не будет объединено), а роли IAM предоставляются (обычно аутентифицированные и не прошедшие проверку подлинности) этим пулом идентификаторов (но у вас может быть больше ролей).

Вот ссылка на powerpoint, объясняющая некоторые основные запутанные аспекты Cognito, я надеюсь, что это поможет. Cognito outline

Наконец, я рекомендую вам начать реализацию с использованием AWS Mobile Hub (по крайней мере, в качестве примера), в отличие от использования IOS SDK. Мобильный концентратор - тонкая обертка, но делает много подъема подъема и красиво оформлен.

+0

Итак, это выглядит довольно устрашающе. Похоже, что в мобильном хабе есть несколько полезных функций для настройки. Однако он не имеет ничего для браузера/javascript. Ваш ответ по-прежнему очень полезен для меня, поэтому я, вероятно, буду отмечать его как правильное, когда я его подключу, возможно, с редактированием, чтобы добавить часть, зависящую от браузера. Большое спасибо за Вашу помощь! – Stephen

+0

Вы правы, мобильный концентратор не делает Javascript. Но он правильно настроит ваши роли IAM и поможет вам создать пул идентификаторов и пул пользователей, а также политики IAM для материала, к которому вы хотите получить доступ, и, если вы не привыкли ко всему этому, он получает немного разрабатывать. Удачи и спасибо – Bruce0