验证GoogleId令牌我正在使用ASP.NETCore为Android客户端提供API。Android使用Google帐户登录并将ID令牌JWT作为不记名令牌传递给API。我的应用程序正在运行并且它确实通过了身份验证检查,但我不认为它正在验证令牌签名。根据谷歌的文档,我可以调用这个urlhttps://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123,但是我在服务器端找不到相应的钩子来做这个。同样根据Google文档,我可以以某种方式使用客户端访问API来执行此操作,而无需每次都调用服务器。我的配置代码:app.UseJwtBearerAuthentication(newJwtBearerOptions(){Authority="https://accounts.google.com",Audience="hiddenfromyou.apps.googleusercontent.com",TokenValidationParameters=newTokenValidationParameters(){ValidateAudience=true,ValidIssuer="accounts.google.com"},RequireHttpsMetadata=false,AutomaticAuthenticate=true,AutomaticChallenge=false,});如何获取JWTBearer中间件来验证签名?我几乎要放弃使用MS中间件并自己动手了。您可以通过几种不同的方式验证服务器端ID令牌的完整性:“手动”-不断下载Google的公钥,验证签名,然后是每个字段,包括issone;主要优势(尽管我认为这是一个小优势)我在这里看到的是,您可以最大限度地减少发送给Google的请求数量。“自动”-使用GoogleAPI客户端库在Google端点上执行GET以验证此令牌https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}-与官方客户端库一样。下面是第二个看起如何:privateconststringGoogleApiTokenInfoUrl="https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={0}";publicProviderUserDetailsGetUserDetails(stringproviderToken){varhttpClient=newMonitoredHttpClient();varrequestUri=newUri(string.Format(GoogleApiTokenInfoUrl,providerToken));httpResponseMessagehttpResponseMessage;尝试{httpResponseMessage=httpClient.GetAsync(requestUri).Result;}catch(Exceptionex){返回空值;}if(httpResponseMessage.StatusCode!=HttpStatusCode.OK){返回null;}varresponse=httpResponseMessage.Content.ReadAsStringAsync().Result;vargoogleApiTokenInfo=JsonConvert.DeserializeObject(响应);if(!SupportedClientsIds.Contains(googleApiTokenInfo.aud)){Log.WarnFormat("GoogleAPI令牌信息aud字段({0})不包含所需的客户端ID",googleApiTokenInfo.aud);返回空值;}返回新的ProviderUserDetails{Email=googleApiTokenInfo.email,FirstName=googleApiTokenInfo.given_name,LastName=googleApiTokenInfo.family_name,Locale=googleApiTokenInfo.locale,Name=googleApiTokenInfo.name,ProviderUserId=googleApiTokenInfo.sub};}GoogleApiTokenInfo类:publicclassGoogleApiTokenInfo{//////响应的Issuer的IssuerIdentifier。对于GoogleID令牌,始终使用https://accounts.google.com或accounts.google.com。///公共字符串iss{get;放;}//////访问令牌哈希。提供访问令牌与身份令牌相关联的验证。如果ID令牌在服务器流中与访问令牌一起发出,则它始终包含在///中。这可以用作防止跨站点请求伪造攻击的替代机制,但如果您遵循步骤1和步骤3,则无需验证///访问令牌。///公共字符串at_hash{get;放;}//////标识此ID令牌的目标受众。它必须是您应用程序的OAuth2.0客户端ID之一离子化。///公共字符串aud{get;放;}//////用户的标识符,在所有Google帐户中是唯一的,绝不会重复使用。一个Google帐户在不同的时间点可以有多个电子邮件,但子值永远不会///改变。在您的应用程序中使用sub作为用户的唯一标识符键。///publicstringsub{get;放;}//////如果用户的电子邮件地址已经过验证则为真;否则为假。///publicstringemail_verified{get;放;}//////授权演示者的client_id。仅当请求ID令牌的一方与ID令牌的受众不同时才需要此声明。这可能是Google的混合应用程序的///案例,其中Web应用程序和Android应用程序具有不同的client_id但共享相同的项目。///公共字符串azp{get;放;}//////用户的电子邮件地址。这可能不是唯一的,不适合用作主键。仅在您的s时提供cope包含字符串“email”。///公共字符串电子邮件{get;放;}//////颁发ID令牌的时间,以Unix时间(整数秒)表示。///公共字符串iat{get;放;}//////ID令牌过期的时间,以Unix时间(整数秒)表示。///公共字符串exp{get;放;}//////用户的全名,以可显示的形式。可能在以下情况下提供:///请求范围包含字符串“profile”///从令牌刷新返回ID令牌///当存在名称声明时,您可以使用它们来更新应用的用户记录。请注意,此声明永远不会保证存在。///公共字符串名称{get;放;}//////用户头像的URL。可能在以下情况下提供:///请求范围包含字符串“profile”///从令牌刷新返回ID令牌///当图片声明存在时,您可以使用它们来更新应用程序的用户记录。请注意,这个克莱m永远不会保证存在。///公共字符串图片{get;放;}publicstringgiven_name{得到;放;}publicstringfamily_name{get;放;}publicstringlocale{get;{得到;放;}publicstringkid{get;放;根据这个github问题,您现在可以使用GoogleJsonWebSignature.ValidateAsync方法通过简单地将idToken字符串传递给该方法来验证Google签名的JWT。varvalidPayload=awaitGoogleJsonWebSignature.ValidateAsync(idToken);Assert.NotNull(有效负载);如果无效,它将返回null。请注意,要使用此方法,您需要直接安装Google.Apis.Authnuget。Google在openIdconnect的文档中指出,出于调试目的,您可以使用Google的tokeninfo端点。假设您的ID令牌的值为XYZ123。您不应使用此端点来验证您的JWT。验证ID令牌需要几个步骤:validationID令牌由颁发者正确签名。Google颁发的令牌使用在发现文档的jwks_uri字段中指定的URI中找到的证书之一进行签名。validationID令牌中的iss值是否等于https://accounts.google.com或accounts.google.com。validationID令牌中的aud值是否等于应用程序的客户端ID。validationIDtoken的过期时间(exp)是否未过。如果您在请求中传递了hd参数,请验证ID令牌是否具有与您的GSuite托管域匹配的HD声明。这里有一个关于如何验证它们的官方示例项目。遗憾的是,我们尚未将其添加到Google.Net客户端库中。它被记录为一个问题所以,我想通了,因为OpenIDConnect规范有一个/.well-known/url,其中包含验证令牌所需的信息。这包括访问已签名的公钥。JWT中间件形成一个来自权威机构的.well-knownurl,检索信息,然后继续对自己进行身份验证。这个问题的简短回答是验证已经在中间件中发生,没有什么可做的了。以上就是C#学习教程的全部内容:validationGoogleIdtoken分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
