有几个不同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