有幾個不同ways在其中您可以驗證在服務器端的ID令牌的完整性:
- 「手動」 - 不斷下載谷歌的公鑰驗證簽名,然後每字段,包括
iss
之一;我在這裏看到的主要優勢(儘管我認爲很小),可以最大限度地減少發送給Google的請求數量。
- 「自動」 - 做谷歌的端點的GET來驗證此令牌
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
- 使用谷歌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
};
}
如果您要驗證該用戶有一個有效的帳戶/電子郵件地址,然後沒有你可能不應該忽略它。你如何實現這個登錄?我還沒有嘗試過,但是如果email_verified作爲配置文件範圍的一部分返回,並且所涉及的用戶沒有Google+帳戶,我不知道它是否會返回。 – DaImTo
如果用戶驗證了電子郵件,那麼我們應該在該聲明中返回true。我們需要研究這一點。如果可能,您可以通過我的G +個人資料向我發送用戶的電子郵件地址嗎? – nvnagr
@nvnagr我給你發了兩個例子,通過G + – Rob