带有 .NET JSON Web 令牌处理程序的 Google 身份工具包令牌验证异常
Posted
技术标签:
【中文标题】带有 .NET JSON Web 令牌处理程序的 Google 身份工具包令牌验证异常【英文标题】:Google identiy toolkit token validation exception with .NET JSON web token handler 【发布时间】:2016-01-24 08:37:11 【问题描述】:我正在尝试将 GIT 集成到我的网站中。我已成功实施该工具包,并希望使用设置期间提供的 *.p12 证书验证从 Google API 发送的 JWT。
异常详细信息:System.IdentityModel.SignatureVerificationFailedException:IDX10501:签名验证失败。尝试的密钥:'System.IdentityModel.Tokens.X509SecurityKey'。
收到的 JSON Web 令牌: 令牌:'"alg":"RS256","kid":"qwYevA"。"iss":"https://identitytoolkit.google.com/","aud":"238895676270-i8o5fe2poogs83nki8jl5tgtfm7h9n5l.apps.googleusercontent.com","iat ":1445739256,"exp":1446948856,"user_id":"","email":"","provider_id":"google.com","verified":true,"display_name":""'
var signingToken = new X509SecurityToken(new X509Certificate2(fileName, "notasecret"));
TokenValidationParameters validationParameters =
new TokenValidationParameters()
IssuerSigningKey = new X509SecurityKey(new X509Certificate2(fileName, "notasecret")),
ValidAudience = "238895676270-i8o5fe2poogs83nki8jl5tgtfm7h9n5l.apps.googleusercontent.com",
ValidIssuer = "https://identitytoolkit.google.com/",
IssuerSigningKeyResolver = (token, a, ski, tvp) => return new X509SecurityKey(new X509Certificate2(fileName, "notasecret")); ,
IssuerSigningToken = signingToken,
;
SecurityToken st;
var result = tokenHandler.ValidateToken((Request.Cookies["gtoken"]).Value, validationParameters, out st);
【问题讨论】:
【参考方案1】:Identity Toolkit 生成的 JWT 由 Identity Toolkit 自己的 RSA 私钥签名,而不是您在设置期间下载的 .p12。
您需要从 https://www.googleapis.com/identitytoolkit/v3/relyingparty/publicKeys?key=YOUR_SERVER_API_KEY
下载当前有效的 Identity Toolkit X509 公共证书,在您收到的 JWT 中为“孩子”选择证书,并使用该证书构建 X509Certificate2。
SERVER_API_KEY 可以在您创建 OAuth2 客户端的 Google Developers Console 中生成。
【讨论】:
谢谢金。您能否详细说明如何在 .NET 中使用 publicKeys 创建证书?文档中提到的 *.p12 有什么用?文档中的每个示例似乎都使用 *.p12。 我不是 .NET 方面的专家,但您可能可以使用 new X509Certificate2(Convert.FromBase64String(certString)) 之类的东西,其中可以如上所述下载 certString。 .p12 文件包含您自己的私钥,当您对 Google 进行 API 调用时,您可以使用它来证明您的开发者帐户。其他人不知道您的私钥,因此他们无法在 Google 访问您的项目数据。 Google Identity Toolkit 公共证书用于另一个方向 - 您的服务器需要验证 IdToken 确实是由 Google Identity Toolkit 颁发的。 知道了!对于未来/未来的任何人,证书从 publicKeys 方法上的 GET 请求传递的方式需要转换为 FromBase64String 方法的有效文本(因为它是原始发送的)。在我的情况下,我将 \n 混淆为证书中的有效字符。谢谢金。以上是关于带有 .NET JSON Web 令牌处理程序的 Google 身份工具包令牌验证异常的主要内容,如果未能解决你的问题,请参考以下文章
带有 PHP 和 Angular.js 的 JWT(JSON Web 令牌)
对 Bearer 令牌使用 JSON Web 令牌和 Firestore 支持
.net Web API。如何从访问令牌中检索用户属性(用户 ID)?基于当前用户/令牌的请求处理程序代码
带有 OWIN 的 webapi 中的复杂 JSON Web 令牌数组