使用 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 个人资料图片?

如何在UWP应用中实现Google登录?

如何在 C# 中使用服务帐户登录 Google API - 凭据无效

使用 .net api 通过 Google 登录

如何将 Google Play 游戏登录与 Firebase 身份验证结合使用

如何在 asp.net 4.5 中使用 facebook 帐户开发登录