来自 Google 的 ID 令牌中的 email_verified = false

Rob*_*Rob 8 google-authentication jwt google-oauth

我使用Google ID 令牌让用户登录我的网络服务。作为验证从 Google 收到的令牌的一部分,网络服务会email_verified = true在令牌的有效负载中检查该令牌。

我的一些用户使用非 Gmail、非 Google Apps 电子邮件地址注册了 Google 帐户。他们确实点击了谷歌在注册后发送给他们的电子邮件中的链接,以验证他们的电子邮件地址。

当这些用户尝试登录我的网络服务时,我会获取email_verified = false令牌的有效负载。

这是什么意思?我可以/应该在验证令牌时忽略它吗?

Ale*_*scu 0

您可以通过多种不同的方式来验证服务器端 ID 令牌的完整性:

  1. “手动”-不断下载Google的公钥,验证签名,然后验证每个字段,包括该iss字段;我在这里看到的主要优点(尽管在我看来很小)是您可以最大限度地减少发送到 Google 的请求数量。
  2. “自动”- 在 Google 端点上执行 GET 来验证此令牌 https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
  3. 使用 Google API 客户端库 - 类似于官方的客户端库

看起来是这样的:

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
    };
}
Run Code Online (Sandbox Code Playgroud)