我試過3個不同的選項,第一個工作了我的情況:
第一個選項 - 上拉姆達側每次調用驗證谷歌ID令牌
我總是通過id_token作爲標題上客戶端調用(Web和移動應用程序)。
「acceptableHds」是允許的域列表。
const oauth = new Auth.OAuth2(CLIENT_ID_WEB, CLIENT_SECRET);
oauth.verifyIdToken(token, null, (err, ticket) => {
if (err) {
return reject(err);
}
const payload = ticket.getPayload();
const tokenIsOK = payload &&
payload.aud === CLIENT_ID &&
new Date(payload.exp * 1000) > new Date() &&
acceptableISSs.has(payload.iss) &&
acceptableHds.has(payload.hd)
return tokenIsOK ? resolve(payload.hd) : reject();
});
第二個方案 - 在拉姆達側面驗證谷歌ID令牌一次
我開始這種替代方式,但我並沒有結束,因爲第一個解決方案,適合我的需要和里程碑接近(它需要一個恆等式池):
1)發送id_token的lambda函數,並驗證其在谷歌API(在這裏你可以使用上面的代碼)檢查域
2)鈣在使用來自瀏覽器的id_token的lambda端的cognitoidentity.getOpenIdTokenForDeveloperIdentity
3)在客戶端上,使用從getOpenIdToken返回的令牌調用任意Cognito或STS函數,如assumeWebIdentity,AssumeRole。
function getCognitoToken(id_token) {
var param = {
IdentityPoolId: 'us-east-1:f7b3d55f-6b63-4097-be8f-3dc22ddec1a4',
Logins: { 'accounts.google.com': id_token }
}
return check_company(id_token).then(function (valid) {
return cognitoidentity.getOpenIdTokenForDeveloperIdentity(param).promise()
})
我無法完成第三步。您需要使用第二步收到的令牌,而不會泄露「身份池ID」。如果你這樣做,並確保該角色無法列出身份池ID,它將按預期工作,並且將是安全的。
第三個選擇 - SAML提供商
您可以創建一個SAML提供者使用SAML斷言來驗證用戶域。
http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html
我慘敗試圖做到這一點。
P.S:谷歌聯繫,讓您創建私有應用程序,從而限制了你公司的域名,但它僅適用於手機,據我所知
https://support.google.com/a/answer/2494992?hl=en
希望它可以幫助別人!