Jwt 来自谷歌的ID令牌中的email_verified=false

Jwt 来自谷歌的ID令牌中的email_verified=false,jwt,google-authentication,google-oauth,Jwt,Google Authentication,Google Oauth,我用于将用户登录到我的Web服务。作为验证从Google收到的令牌的一部分,Web服务检查令牌有效负载中的email\u verified=true 我的一些用户使用他们的非Gmail、非Google应用程序电子邮件地址。他们确实点击了谷歌在注册后发送给他们的电子邮件中的链接,以验证他们的电子邮件地址 当这些用户尝试登录到我的Web服务时,我会在令牌的有效负载中获得email\u verified=false 这意味着什么?我可以/应该在验证令牌时忽略这一点吗?有几种不同的方法可以在服务器端验证

我用于将用户登录到我的Web服务。作为验证从Google收到的令牌的一部分,Web服务检查令牌有效负载中的
email\u verified=true

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

当这些用户尝试登录到我的Web服务时,我会在令牌的有效负载中获得
email\u verified=false


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

有几种不同的方法可以在服务器端验证ID令牌的完整性:

  • “手动”-不断下载谷歌的公钥,验证签名,然后验证每个字段,包括
    iss
    one;我在这里看到的主要优势(虽然在我看来是一个小优势)是,您可以最大限度地减少发送到谷歌的请求数量
  • “自动”-在Google的端点上进行一次GET以验证此令牌
    https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}
  • 使用GoogleAPI客户端库-如
  • 下面是它的外观:

    private const string googleapitokeninfour=”https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}";
    公共ProviderUserDetails GetUserDetails(字符串providerToken)
    {
    var httpClient=new MonitoredHttpClient();
    var requestUri=新Uri(string.Format(Googleapitokenfour,providerToken));
    HttpResponseMessage HttpResponseMessage;
    尝试
    {
    httpResponseMessage=httpClient.GetAsync(requestUri).Result;
    }
    捕获(例外情况除外)
    {
    返回null;
    }
    if(httpResponseMessage.StatusCode!=HttpStatusCode.OK)
    {
    返回null;
    }
    var response=httpResponseMessage.Content.ReadAsStringAsync().Result;
    var googleApiTokenInfo=JsonConvert.DeserializeObject(响应);
    如果(!SupportedClientsIds.Contains(googleApiTokenInfo.aud))
    {
    Log.WarnFormat(“Google API令牌信息aud字段({0})不包含所需的客户端id”,googleApiTokenInfo.aud);
    返回null;
    }
    返回新的ProviderUserDetails
    {
    Email=googleApiTokenInfo.Email,
    FirstName=googleApiTokenInfo.given_name,
    LastName=googleApiTokenInfo.family\u name,
    Locale=googleApiTokenInfo.Locale,
    Name=googleApiTokenInfo.Name,
    ProviderUserId=googleApiTokenInfo.sub
    };
    }
    
    如果您正在验证用户是否拥有有效的帐户/电子邮件地址,那么您可能不应该忽略它。您是如何实现此登录的?我没有尝试过,但是如果email_验证返回作为配置文件范围的一部分,并且相关用户没有Google+帐户,我想知道它是否会返回。如果用户验证了电子邮件,那么我们应该在该声明中返回true。我们需要调查一下。如果可能的话,你能通过我的G+档案向我发送用户的电子邮件地址吗?@nvnagr我通过G+向你发送了两个示例,我不知道第二个选项,这是一个很好的提示!我有第一个选择。但这并不能回答问题:由于JWT Google问题中的电子邮件_verified仍然是错误的,我的问题是我是否应该接受这一点,Alexandru,tokeninfo端点是用来帮助调试的。创建id_令牌是为了便于服务器验证,而无需进行会增加延迟的网络调用。您的建议会产生安全问题。id令牌验证的非常重要的部分是验证令牌是否用于您的服务器(访问群体字段)。通过调用tokeninfo,您只会知道它是一个有效的id_令牌,但是除非您检查访问群体,否则您将创建一个安全问题。最好的选择是使用库。应避免使用tokeninfo端点。Hi@nvnagr,关于
    aud
    字段的验证,如果仔细观察,您可以在该页面上看到,Google也明确说明了这一点——我也在提供的代码示例中这样做。@Rob除非您能够证明Tokenfo端点响应的是
    HttpStatusCode 200 OK
    ,即使电子邮件未经验证(false),否则我认为没有任何问题