Javascript 如何在AWS上获取凭据?我必须使用AWS Cognito SDK或AWS SDK吗?

Javascript 如何在AWS上获取凭据?我必须使用AWS Cognito SDK或AWS SDK吗?,javascript,amazon-web-services,aws-sdk,amazon-iam,amazon-cognito,Javascript,Amazon Web Services,Aws Sdk,Amazon Iam,Amazon Cognito,我正在使用AWS SDK为AWS S3构建一个丰富的前端客户端。将IAM凭证硬编码到AWS SDK配置中效果很好,但我想通过AWS Cognito为最终用户提供访问权限 我如何为我在Cognito用户池中创建的用户获取凭据 AWS文件非常不清楚。我看到了一些使用AWS SDK的示例,还有一些示例说您需要一个不同的AWS Cognito SDK。哪篇文档文章是正确的 对于这个特定的项目,我根本不想使用第三方联合身份 更新2: AWS Cognito SDK已经合并到一个名为AWS Amplify

我正在使用AWS SDK为AWS S3构建一个丰富的前端客户端。将IAM凭证硬编码到AWS SDK配置中效果很好,但我想通过AWS Cognito为最终用户提供访问权限

我如何为我在Cognito用户池中创建的用户获取凭据

AWS文件非常不清楚。我看到了一些使用AWS SDK的示例,还有一些示例说您需要一个不同的AWS Cognito SDK。哪篇文档文章是正确的

对于这个特定的项目,我根本不想使用第三方联合身份


更新2:

AWS Cognito SDK已经合并到一个名为AWS Amplify的新库中。

更新1:

这个问题是双重的。理解术语并正确设置Cognito是第一部分。感谢Bruce0让我站起来在那里跑步。第二部分是javascript部分。事实证明,您需要两个单独的库来纯粹从javascript对Cognito用户进行身份验证

这就是我想出的解决办法。如果您对es6不熟悉,请确保您已经学习过Promissions/async/await。要在节点中运行它,只需使用babel、preset es2015、preset stage-2和babel transform运行时插件对其进行预处理。如果你想在浏览器中运行它,你可能需要使用babel loader和webpack(这是出了名的复杂设置,只是一个预先警告)


在Cognito中获取凭据的唯一方法是创建一个联邦身份池。cognitoIdentity和credentialsProvider方法是获取凭据的方式

要使用联合身份池,您不必使用联合身份,但您需要有一个identityId(并且这些ID只存在于池中)才能获取凭据

因此,您将拥有一个cognitoUserPool作为联合身份池中唯一的身份验证提供者(没有任何内容将被联合),并且该身份池提供IAM角色(通常经过身份验证和未经身份验证)(但您可以拥有更多角色)

这里有一个powerpoint的链接,解释了Cognito的一些基本的令人困惑的方面,我希望这会有所帮助


最后,我建议您使用AWS Mobile Hub(至少作为示例)开始实施,而不是使用IOS SDK。MobileHub是一个薄薄的包装器,但它做了大量的提升工作,并且结构很好。

下面这对我很有用,我设置了cognito来创建一个身份池,IAM来向用户添加配置文件(我完全遵循了这个链接:)


我只希望我们不需要导入aws sdk/global,因为它本身是206k未统一的。这对用户来说是一个很大的负担。

我不会在客户机上对aws sdk做太多的处理,因为它需要在客户机上提供aws密钥。我要么使用cognito,要么在后端使用aws sdk,并在客户端上使用预先签名的请求在cognito中获取凭据的唯一方法是创建一个联合身份池。cognitoIdentity和credentialsProvider方法是获取凭据的方式。要使用联合身份池,您不必使用联合身份,但您需要有一个identityId(并且这些标识只存在于池中)。因此,您将拥有一个cognitoUserPool作为联合身份池中唯一的身份验证提供者(没有任何内容将被联合),并且该身份池提供IAM角色(通常经过身份验证和未经身份验证)(但您可以拥有更多角色)@Bruce0!这就是我目前所经历的。Cognito似乎真的是革命性的。非常感谢您的帮助,毫无疑问,您的帮助将在未来几个月对数百万人产生积极影响,不包括空白;)看起来真是太棒了。看起来移动中心有一些很好的设置功能。不过,它没有用于浏览器/javascript的任何内容。你的答案仍然对我非常有帮助,所以当我连接它时,我可能会将它标记为正确的,可能需要编辑以添加特定于浏览器的部分。非常感谢你的帮助!您是对的,移动集线器不执行Javascript。但它将正确设置您的IAM角色,帮助您设置身份池和用户池,并为您想要访问的内容执行IAM策略。除非您习惯了所有这些内容,否则它会变得有点复杂。祝你好运,谢谢
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();
import S3 from 'aws-sdk/clients/s3'
import AWS from 'aws-sdk/global'

AWS.config.update({
  region: process.env.AZ_REGION,
  credentials: new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'XXX'
  })
});

const s3 = new AWS.S3({
apiVersion: '2006-03-01',
params: {Bucket: process.env.AZ_BUCKETNAME},
      });