我正在使用AWS SDK爲AWS S3構建豐富的前端客戶端。將IAM憑證硬編碼到AWS SDK配置中工作正常,但我想通過AWS Cognito配置對最終用戶的訪問。如何在AWS上獲取憑據?我必須使用AWS Cognito SDK或AWS SDK嗎?
如何獲取我在Cognito用戶池中創建的用戶的憑據?
AWS文檔很不清楚。我見過的使用AWS SDK的示例以及我見過的示例說您需要擁有不同的AWS Cognito SDK。哪篇文檔是正確的?
對於這個特定的項目我不想想要使用第三方聯合身份。
UPDATE
問題是雙重的。理解術語並正確設置Cognito是第一部分。感謝Bruce0讓我在那裏運行。第二部分是javascript部分。事實證明,您需要兩個單獨的庫來純粹從JavaScript驗證Cognito用戶。
這是我想出的解決方案。如果它對你來說看起來很陌生,請確保你已經用promise/async/await研究了你的es6。要在節點中運行它,只需使用babel,預設es2015,預設階段2和babel-transform-runtime插件對其進行預處理。如果你想在瀏覽器中運行它,你可能需要使用帶有webpack的babel-loader(設置起來非常複雜,只是一個預警)。
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方法是您獲取憑證的方式。您不必使用聯合標識池來聯合標識,但您需要具有標識Id(並且只存在於池中)。因此,您將擁有一個cognitoUserPool作爲聯合身份驗證池中唯一的身份驗證提供程序(沒有任何聯合身份驗證提供程序),並且該身份池提供了IAM角色(通常是身份驗證和未驗證)(但您可以擁有更多角色) – Bruce0
@ Bruce0!這是我目前所經歷的。 Cognito似乎確實是革命性的。我們非常感謝您的幫助,並且在未來幾個月內無疑會對數百萬人產生積極影響,但不包括空白;) – Stephen