1

我正在使用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

+0

我不會在客戶端上使用aws sdk,因爲它需要在客戶端上提供AWS密鑰。我要麼與cognito一起,要麼在後端使用aws sdk,並在客戶端上使用預先登記的請求 – Guig

+1

在Cognito中獲取憑據的唯一方法是創建聯合身份庫。 cognitoIdentity和credentialsProvider方法是您獲取憑證的方式。您不必使用聯合標識池來聯合標識,但您需要具有標識Id(並且只存在於池中)。因此,您將擁有一個cognitoUserPool作爲聯合身份驗證池中唯一的身份驗證提供程序(沒有任何聯合身份驗證提供程序),並且該身份池提供了IAM角色(通常是身份驗證和未驗證)(但您可以擁有更多角色) – Bruce0

+0

@ Bruce0!這是我目前所經歷的。 Cognito似乎確實是革命性的。我們非常感謝您的幫助,並且在未來幾個月內無疑會對數百萬人產生積極影響,但不包括空白;) – Stephen

回答

4

獲得在Cognito證書的唯一方法是創建一個聯邦身份池。 cognitoIdentity和credentialsProvider方法是您獲取憑證的方式。

您不必將身份聯合使用聯合身份庫,但您需要擁有身份標識(以及只存在於池中的身份標識)以獲取憑據。

所以你必須通過身份游泳池cognitoUserPool作爲聯合身份池(沒有什麼會是聯盟)唯一的身份驗證提供者和IAM角色提供(通常是通過身份驗證和未驗證)(但你可以有更多的角色)。

下面是一個powerpoint的鏈接,解釋了Cognito的一些基本混淆方面,我希望這會有所幫助。 Cognito outline

最後,我會建議您使用AWS Mobile Hub(至少作爲示例)開始實施,而不是使用IOS SDK。移動集線器是一個薄的包裝,但有很大的提升能力,並且設計得非常好。

+0

因此,看起來非常棒。它看起來像移動樞紐有一些很好的功能來建立。它沒有任何瀏覽器/ JavaScript的。你的回答對我來說仍然是非常有幫助的,所以當我連接時可能會標記爲正確,也許是通過編輯來添加特定於瀏覽器的內容。非常感謝你的幫助! – Stephen

+0

你是對的,移動樞紐沒有做Javascript。但它會讓你的IAM角色正確設置,並幫助你設置身份池和用戶池,併爲你想訪問的東西做IAM策略,除非你習慣了所有這些東西,它會得到一點闡述。祝你好運,謝謝 – Bruce0