使用 Google 登录 - 我们如何在 .net 中验证 Google ID 令牌服务器端?缺少代码示例,库似乎已弃用
Posted
技术标签:
【中文标题】使用 Google 登录 - 我们如何在 .net 中验证 Google ID 令牌服务器端?缺少代码示例,库似乎已弃用【英文标题】:Sign in with Google - how can we verify the Google ID token server side in .net? Code sample missing, library appears deprecated 【发布时间】:2021-12-18 16:42:26 【问题描述】:我们正在根据最新文档在 MVC5 应用程序中实现“使用 Google 登录”,这与我们在网络上看到的大多数示例完全不同且更直接。
该过程的一部分是“在您的服务器端验证 Google ID 令牌”,如本页所述:https://developers.google.com/identity/gsi/web/guides/verify-google-id-token
我们在这里被告知“与其编写您自己的代码来执行这些验证步骤,我们强烈建议您为您的平台使用 Google API 客户端库”,这很公平,但是
a) 该页面上没有 .net 的代码示例, b) 项目文档似乎与 Sign in with Google 没有任何关系 c) 如果您真的在这里查看 .net 客户端库的 github:https://github.com/googleapis/google-api-dotnet-client 它说“支持此客户端库,但仅在维护模式下”,这让我想知道我们是否打算使用它。
谁能给我们一些指导,说明我们是应该使用那个库,还是手动编码我们的解决方案,还是使用某种第三方 JWT 库?
感谢阅读!
【问题讨论】:
我遇到了和你一样的问题,并决定只使用Google.Apis.Auth
包:nuget.org/packages/Google.Apis.Auth(await GoogleJsonWebSignature.ValidateAsync(idToken);
(这是google-api-dotnet-client
的一部分)。我想这仍然是推荐的方式。
谢谢,很高兴不只是我们!
【参考方案1】:
我想这就是你要找的。p>
Retrieving the user identity
using Google.Apis.Auth;
using System;
using System.Threading;
using System.Threading.Tasks;
public class IAPTokenVerification
/// <summary>
/// Verifies a signed jwt token and returns its payload.
/// </summary>
/// <param name="signedJwt">The token to verify.</param>
/// <param name="expectedAudience">The audience that the token should be meant for.
/// Validation will fail if that's not the case.</param>
/// <param name="cancellationToken">The cancellation token to propagate cancellation requests.</param>
/// <returns>A task that when completed will have as its result the payload of the verified token.</returns>
/// <exception cref="InvalidJwtException">If verification failed. The message of the exception will contain
/// information as to why the token failed.</exception>
public async Task<JsonWebSignature.Payload> VerifyTokenAsync(
string signedJwt, string expectedAudience, CancellationToken cancellationToken = default)
SignedTokenVerificationOptions options = new SignedTokenVerificationOptions
// Use clock tolerance to account for possible clock differences
// between the issuer and the verifier.
IssuedAtClockTolerance = TimeSpan.FromMinutes(1),
ExpiryClockTolerance = TimeSpan.FromMinutes(1),
TrustedAudiences = expectedAudience
;
return await JsonWebSignature.VerifySignedTokenAsync(signedJwt, options, cancellationToken: cancellationToken);
该库处于维护模式,因为它已被 Google 视为稳定/已完成。他们只会在发现关键时对其进行更改 问题。
【讨论】:
【参考方案2】:我希望这个网址对你有帮助: https://googleapis.dev/dotnet/Google.Apis.Auth/latest/api/Google.Apis.Auth.GoogleJsonWebSignature.html
using Google.Apis.Auth;
using Google.Apis.Auth.OAuth2;
GoogleJsonWebSignature.Payload payload = await GoogleJsonWebSignature.ValidateAsync(Token);
这是一个关于如何验证令牌的小示例。
【讨论】:
谢谢,这确实有帮助 - 但不应该有更多的验证(例如验证 csrf 令牌,以及“使用 Google 的公钥(以 JWK 或 PEM 格式提供)来验证令牌的签名。这些密钥定期轮换;检查响应中的 Cache-Control 标头以确定何时应该再次检索它们。“?也许 validate 方法会自动执行后者,我们只需要手动编写 csrf 检查代码?以上是关于使用 Google 登录 - 我们如何在 .net 中验证 Google ID 令牌服务器端?缺少代码示例,库似乎已弃用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ASP.Net Core Identity 从登录用户中检索 Google 个人资料图片?
如何在 C# 中使用服务帐户登录 Google API - 凭据无效