0

我們正在使用應用服務身份驗證來保護Web API並將Google用作身份驗證提供程序。它的工作原理,當我們火從瀏覽器的請求(當會話信息的cookie中)使用Google oAuth 2.0承載令牌進行Azure應用服務身份驗證

IIS日誌按預期:

2016-05-29T13:51:19 PID放牧收到[3600]請求:GET https://XXXXXX.azurewebsites.net/api/user 2016-05-29T13:51:19 PID [3600] Verbose爲站點 'XXXXXX.azurewebsites.net'找到'AppServiceAuthSession'cookie。長度:728. 2016-05-29T13:51:19 PID [3600]詳細使用'Session Cookie'認證成功驗證了[email protected]

但是,當我們使用API​​測試工具,如郵差,並設置授權頭與承載令牌,它總是導致重定向。

IIS日誌:

2016-05-29T13:53:38 PID [3600]詳細接收的請求:POST https://XXXXX.azurewebsites.net/api/user 2016-05-29T13:53:38 PID [3600]信息重定向: https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=XXXXXXX-XXXXX7attpunn9smo4.apps.googleusercontent.com&redirect_uri=https%3A%2F%2FXXXXXX.azurewebsites.net%2F.auth%2Flogin%2Fgoogle%2Fcallback&scope=openid+profile+email&state=nonce%3De5f4aabe11cb4544bf18d00920940d47_20160529135838%26redir%3D%2Fapi%2Fuser

我們還試圖設置 X-謨-AUTH頭具有相同的承載道理,我們會看到錯誤作爲標記不是預期的格式。顯然它期望編碼的JWT令牌。

IIS日誌:

016-05-29T13:51:52 PID [3600]詳細接收的請求:POST https://XXXXXX.azurewebsites.net/api/user 2016-05-29T13:51:52 PID [3600]警告JWT驗證失敗:IDX10708: 'System.IdentityModel.Tokens.JwtSecurityTokenHandler' 無法讀取該 字符串: '承載 ya29.XXXXXXXXXX_RDrX_zsuvMx49e_9QS5ECz9F1yhDHe5j4H9gRN6opkjLXvN1IJZjHXa_Q'。 字符串需要在緊湊JSON格式,它是以下形式: '..' .. 2016-05-29T13:51:52 PID [3600] 信息重定向: https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=XXXXXXX-k5nj6dkf987attpunn9smo4.apps.googleusercontent.com&redirect_uri=https%3A%2F%2FXXXXXX.azurewebsites.net%2F.auth%2Flogin%2Fgoogle%2Fcallback&scope=openid+profile+email&state=nonce%3De15b0915406142378XXXXX_20160529135652%26redir%3D%2Fapi%2Fuser

注: 從Google獲取的不記名令牌有效,因爲我們可以通過撥打電話 https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=[token]

驗證詳情請建議。

回答

0

您使用的Google令牌是訪問令牌,而不是持票人令牌。它可用於訪問Google資源,但不能用於使用Web API進行身份驗證。

我沒能找到這個良好的文檔,但我可以告訴你,在這裏工作,而不是:

  1. 在您的客戶端應用程序,您必須獲得id_token授權碼來自Google。當用戶使用Google OpenID Connect登錄帳戶登錄時,通常會得到此信息。我假設你已經知道如何做到這一點,因爲你已經知道如何獲得訪問令牌。
  2. 發送POST請求至https:// {hostname} /.auth/login/google,其中JSON有效內容類似{"authorization_code":"<code>", "id_token":"<id_token>"}
  3. 成功的登錄響應將包含一個包含authenticationToken字段的JSON有效內容。緩存這個令牌。
  4. 您可以使用來自#3的身份驗證令牌對Web API進行身份驗證調用。把它放在x-zumo-auth HTTP請求頭中。
+0

Chris,我們從未到達第3步,因爲服務器返回內部服務器錯誤。 –

+0

使用Google,我們首先獲取auth_code,然後在隨後的請求中使用它來獲取id_token。 https://developers.google.com/identity/protocols/OpenIDConnect#server-flow IIS日誌: 警告呼叫HTTP端點https://www.googleapis.com/oauth2/v4/token失敗:400(錯誤的請求)。部分響應:{ 「錯誤」:「invalid_grant」, 「error_description」:「代碼已被兌換。」 } ..如果重播先前使用的認證碼,也會發生這種情況。 –

+0

錯誤是有道理的。您可以使用Google的授權流程,在一個響應中返回授權碼和id_token嗎?例如「response_type = code id_token」? https://developers.google.com/identity/protocols/OpenIDConnect#authenticationuriparameters。或者,如果您使用Android,是否可以通過一些Android API調用獨立獲取auth_code和id_token? –

相關問題