2016-11-28 61 views
0

我使用Google ID tokens來登錄用戶到我的web服務。作爲驗證從Google收到的令牌的一部分,web服務會檢查令牌的有效內容中的email_verified = trueemail_verified = false來自Google的ID令牌

我的部分用戶signed up for a Google-account使用非Gmail非Google Apps電子郵件地址。他們確實點擊了註冊後Google發送給他們的電子郵件中的鏈接,以驗證他們的電子郵件地址。

當這些用戶嘗試登錄到我的web服務時,我在令牌的有效負載中獲得email_verified = false

這是什麼意思,可以/我應該忽略這在驗證令牌?

+0

如果您要驗證該用戶有一個有效的帳戶/電子郵件地址,然後沒有你可能不應該忽略它。你如何實現這個登錄?我還沒有嘗試過,但是如果email_verified作爲配置文件範圍的一部分返回,並且所涉及的用戶沒有Google+帳戶,我不知道它是否會返回。 – DaImTo

+0

如果用戶驗證了電子郵件,那麼我們應該在該聲明中返回true。我們需要研究這一點。如果可能,您可以通過我的G +個人資料向我發送用戶的電子郵件地址嗎? – nvnagr

+0

@nvnagr我給你發了兩個例子,通過G + – Rob

回答

0

有幾個不同ways在其中您可以驗證在服務器端的ID令牌的完整性:

  1. 「手動」 - 不斷下載谷歌的公鑰驗證簽名,然後每字段,包括iss之一;我在這裏看到的主要優勢(儘管我認爲很小),可以最大限度地減少發送給Google的請求數量。
  2. 「自動」 - 做谷歌的端點的GET來驗證此令牌 https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
  3. 使用谷歌API客戶端庫 - 如official one

這裏是如何可以看:

private const string GoogleApiTokenInfoUrl = "https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}"; 

public ProviderUserDetails GetUserDetails(string providerToken) 
{ 
    var httpClient = new MonitoredHttpClient(); 
    var requestUri = new Uri(string.Format(GoogleApiTokenInfoUrl, providerToken)); 

    HttpResponseMessage httpResponseMessage; 
    try 
    { 
     httpResponseMessage = httpClient.GetAsync(requestUri).Result; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 

    if (httpResponseMessage.StatusCode != HttpStatusCode.OK) 
    { 
     return null; 
    } 

    var response = httpResponseMessage.Content.ReadAsStringAsync().Result; 
    var googleApiTokenInfo = JsonConvert.DeserializeObject<GoogleApiTokenInfo>(response); 

    if (!SupportedClientsIds.Contains(googleApiTokenInfo.aud)) 
    { 
     Log.WarnFormat("Google API Token Info aud field ({0}) not containing the required client id", googleApiTokenInfo.aud); 
     return null; 
    } 

    return new ProviderUserDetails 
    { 
     Email = googleApiTokenInfo.email, 
     FirstName = googleApiTokenInfo.given_name, 
     LastName = googleApiTokenInfo.family_name, 
     Locale = googleApiTokenInfo.locale, 
     Name = googleApiTokenInfo.name, 
     ProviderUserId = googleApiTokenInfo.sub 
    }; 
} 
+0

我沒有意識到第二種選擇,這是一個很棒的提示!我有第一個選擇。這並沒有回答這個問題,因爲email_verified在JWT谷歌問題中仍然是錯誤的,我的問題是我是否應該接受 – Rob

+0

嗨,Alexandru,tokeninfo終端在那裏幫助調試。創建id_token是爲了讓服務器很容易驗證它,而無需進行網絡調用,從而增加延遲。您的建議會造成安全問題。 id令牌驗證的非常重要的部分是驗證令牌是否適合您的服務器(受衆字段)。通過調用tokeninfo,您只會知道它是一個有效的id_token,但除非您檢查了觀衆,否則您將創建一個安全問題。最好的選擇是使用庫。應該避免使用tokeninfo端點。 – nvnagr

+0

Hi @nvnagr,關於'aud'字段的驗證,如果仔細觀察,您可以在該頁面上看到Google也明確指出了這一點 - 我也在提供的代碼示例中進行了說明。 –

相關問題