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

时间:2016-11-28 08:19:19

标签: google-oauth jwt google-authentication google-oauth2

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

我的部分用户signed up for a Google-account使用非Gmail,非Google Apps电子邮件地址。他们确实点击了Google在注册后发送给他们的电子邮件中的链接,以验证他们的电子邮件地址。

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

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

1 个答案:

答案 0 :(得分:1)

有几个不同的ways,您可以在其中验证服务器端ID令牌的完整性:

  1. “手动” - 不断下载Google的公钥,验证签名,然后检查每个字段,包括iss个字段;主要优势(虽然我认为是一个小优势)我在这里看到的是,您可以最大限度地减少发送给Google的请求数量。
  2. “自动” - 在Google的终端上执行GET以验证此令牌 https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
  3. 使用Google API客户端库 - 例如official one
  4. 这是看起来如何:

    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
        };
    }