2016-10-18 21 views
5

我知道如何通過google-signin-client_id創建Google身份驗證應用程序3089273xx-xxxxxxxxxxxx.apps.googleusercontent.com & <script src="https://apis.google.com/js/platform.js" async defer></script>,但此處的問題是我無法將限制登錄到我公司的G Suite實例適用於基於AWS驅動的瀏覽器的G Suite身份提供商應用程序

我擁有的應用程序是S3上託管的「無服務器」JS捆綁包。登錄的Google令牌綁定到訪問敏感資源的AWS角色。

因此,檢查電子郵件googleUser.getBasicProfile()pass a hd parameter的典型解決方案沒有任何安全意義,因爲它們可以通過瀏覽器開發工具IIUC進行操作。

是否還有其他Google API可以使用,或者我可以應用哪些策略?我想這個解決方案可能會以G Suite託管的我公司的域的google-signin-client_id的特殊格式形式出現。這是它是如何在AWS綁角色:

AWS IAM Google auth

我知道我可以設置重複我的用戶在AWS「用戶池」,並使用Cognito,但我想有一個「單一來源的事實「爲公司員工減輕了管理負擔&。

回答

3

更新:此答案不安全,如果您只是刪除hosted_domain,您可以使用任何Google登錄身份驗證。

https://developers.google.com/identity/work/it-apps &使用GAPI時誤入後直接我發現我可以做一個

GAPI.auth2.init({ 
     client_id: CLIENT_ID, 
     hosted_domain: 'example.com' 
    }) 

,然後隨着documentation advises,你設置管理API客戶端訪問

Authorized API clients

所以現在只有用戶@ example.com上的用戶 Gsuite可以訪問這個JS應用程序!這花了幾個星期才弄清楚。所以剛結束,如何在AWS供電無服務器應用程序中使用谷歌進行身份驗證:

  1. 設置通過OAuth用戶端ID客戶端ID與白名單的起源網址,https://console.developers.google.com/apis/credentials
  2. AWS IAM設置與谷歌的角色作爲帶有客戶ID的(網絡)身份提供商
  3. 將您的客戶ID https://admin.google.com/AdminHome?chromeless=1#OGX:ManageOauthClients添加爲此處的https://developers.google.com/identity/work/it-apps,以便將您的應用程序限制在公司的域中。

因此,現在我們有一個靜態託管應用,僅限公司員工訪問敏感的付費AWS API。

1

我試過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

希望它可以幫助別人!

相關問題