Как превратить объект аутентификации CognitoAuth в учетные данные AWS-SDK

У меня есть пул пользователей когнито, и я могу успешно войти в свое приложение с помощью следующего кода:

const authData = {
        ClientId : '2222222222222', // Your client id here
        AppWebDomain : '1111111111.auth.us-east-1.amazoncognito.com',
        TokenScopesArray : ['openid'],
        RedirectUriSignIn : 'https://app.domain.com',
        RedirectUriSignOut : 'https://app.domain.com'
    };
    const CognitoAuth = AmazonCognitoIdentity.CognitoAuth;

    const auth = new CognitoAuth(authData);



    auth.userhandler = {
        /**onSuccess: <TODO: your onSuccess callback here>,
         onFailure: <TODO: your onFailure callback here>*/

        onSuccess: function(result: any) {
            console.log("COGNITO SUCCESS!");
            console.log(result);
        },
        onFailure: function(err: any) {
            console.log("COGNITO FAIL!");
            console.log(err);
        }
    };

    auth.getSession();

    const curUrl = window.location.href;
    auth.parseCognitoWebResponse(curUrl);

Теперь у меня есть объект аутентификации, который я хотел бы преобразовать в какие-то учетные данные для имеющегося у меня aws-sdk, чтобы я мог перечислять элементы в корзине S3, предполагая правильные политики в моих прикрепленных ролях.

что-то вроде этого, но поймите, что это не работает:

AWS.config.credentials = auth.toCredentials();  //<== hoping for magic
const s3 = new AWS.S3();
s3.listObjectsV2(listObjectsV2Params, function(err: any, data: any) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data.Contents[0]);           // successful response
    });

Возможно ли это, и если да, то как мне это сделать?

UDPATE

Принятый ответ сработал и очень помог, добавив некоторые дополнения для ясности в отношении проблем, с которыми я столкнулся.

const creds = new AWS.CognitoIdentityCredentials({
                IdentityPoolId: 'us-east-1:b111111-1111-1111-1111-1111111',  // <-- This is in your Federated Identity if you have that set up, you have to "edit" the identity pool to get it, logging into cognito its a different screen.
                Logins: {
                    "cognito-idp.us-east-1.amazonaws.com/us-east-1_BBBB1BBBBV2B": result.idToken.jwtToken  // <- this login [POOL ID] is not the pool ARN, you need it in this format.
                }
            });

по этой ссылке мне помогли.


person Pompey Magnus    schedule 03.12.2017    source источник
comment
Спасибо за обновление, так полезно увидеть реальный пример с реалистично выглядящими примерными значениями, потому что, как вы упомянули в комментариях, может быть сложно определить точный формат значений из официальных документов (в которых используются заполнители, такие как ‹ POOL_ID ›вместо).   -  person rangfu    schedule 27.01.2018


Ответы (1)


Это возможно, и следующие шаги.

  • Чтобы разрешить доступ к ресурсам AWS для пользователей AWS Userpool, также необходимо настроить пулы идентификации AWS, зарегистрировав UserPool в качестве поставщика.
  • Роль IAM, назначенная для аутентифицированного пользователя, должна иметь доступ к S3.
  • Используя AWS SDK для Identity Pools, токен UserPools JWT можно обменять на временные AccessKey и SecretKey, чтобы использовать AWS SDK для S3.

        AWS.config.credentials = new AWS.CognitoIdentityCredentials({
          IdentityPoolId: IDENTITY_POOL_ID,
          Logins: {
            [USER_POOL_TOKEN]: result.idToken.jwtToken
          }
        });
    
        AWS.config.credentials.refresh((error) => {
          if (error) {
            console.error(error);
          } else {
            console.log('Successfully logged!');
          }
        });
    
  • Внутри обратного вызова AWS.config.credentials.refresh вы можете вызвать S3, поскольку этот метод внутренне обрабатывает получение временных учетных данных.
person Ashan    schedule 04.12.2017