Javascript 如何在AWS上获取凭据?我必须使用AWS Cognito SDK或AWS SDK吗?
我正在使用AWS SDK为AWS S3构建一个丰富的前端客户端。将IAM凭证硬编码到AWS SDK配置中效果很好,但我想通过AWS Cognito为最终用户提供访问权限 我如何为我在Cognito用户池中创建的用户获取凭据 AWS文件非常不清楚。我看到了一些使用AWS SDK的示例,还有一些示例说您需要一个不同的AWS Cognito 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
更新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},
});