You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6中如何验证Google Token是否属于自有应用凭证

验证Google ID Token是否属于我方.NET Core 6 API的授权应用

要验证前端传入的Google ID Token是否是用你的client_id生成的,核心是校验Token payload里的aud(受众)字段——这个字段的值就是生成该Token的客户端ID。你之前用的无参数GoogleJsonWebSignature.ValidateAsync方法默认不会校验aud,所以需要用带ValidationSettings的重载来显式指定允许的client_id列表。

具体实现步骤:

  1. 配置验证规则
    创建GoogleJsonWebSignature.ValidationSettings实例,将你的client_id(支持多个,比如Web、移动端不同的客户端ID)添加到Audience集合中。

  2. 调用带参数的验证方法
    使用重载的ValidateAsync方法,传入ID Token和配置好的ValidationSettings。如果Token的aud不在指定列表中,方法会直接抛出InvalidJwtException。

代码示例:

基础验证(硬编码client_id)

using Google.Apis.Auth;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/auth")]
public class AuthController : ControllerBase
{
    [HttpPost("validate-google-token")]
    public async Task<IActionResult> ValidateGoogleToken([FromBody] string idToken)
    {
        var validationSettings = new GoogleJsonWebSignature.ValidationSettings
        {
            // 替换成你的实际client_id,可添加多个到列表中
            Audience = new List<string> { "your-web-client-id.apps.googleusercontent.com", "your-mobile-client-id.apps.googleusercontent.com" }
        };

        try
        {
            // 验证Token并获取payload
            var payload = await GoogleJsonWebSignature.ValidateAsync(idToken, validationSettings);
            
            // 验证通过,可进一步使用payload中的信息(比如用户邮箱、ID等)
            return Ok(new { 
                IsValid = true, 
                UserId = payload.Subject, 
                Email = payload.Email 
            });
        }
        catch (InvalidJwtException ex)
        {
            // 验证失败,可能是aud不匹配、Token过期或签名无效
            return BadRequest(new { 
                IsValid = false, 
                Message = $"Token验证失败: {ex.Message}" 
            });
        }
    }
}

从配置文件读取client_id(推荐)

在appsettings.json中添加配置:

{
  "GoogleAuth": {
    "AllowedClientIds": [
      "your-web-client-id.apps.googleusercontent.com",
      "your-mobile-client-id.apps.googleusercontent.com"
    ]
  }
}

在Program.cs中注册配置:

builder.Services.Configure<List<string>>(builder.Configuration.GetSection("GoogleAuth:AllowedClientIds"));

在控制器中注入并使用:

private readonly List<string> _allowedGoogleClientIds;

public AuthController(IOptions<List<string>> allowedGoogleClientIds)
{
    _allowedGoogleClientIds = allowedGoogleClientIds.Value;
}

[HttpPost("validate-google-token")]
public async Task<IActionResult> ValidateGoogleToken([FromBody] string idToken)
{
    var validationSettings = new GoogleJsonWebSignature.ValidationSettings
    {
        Audience = _allowedGoogleClientIds
    };

    // 后续验证逻辑和上面一致...
}

关键说明:

  • 为什么不需要client_secret?Google ID Token是基于JWT的,其有效性通过Google的公钥签名验证,不需要你的client_secret;我们只需要校验aud字段,确保Token是发给我们的客户端的。
  • 默认校验规则:ValidationSettings会自动校验Token的签发者(iss必须是https://accounts.google.com)、过期时间等,无需额外配置。

内容的提问来源于stack exchange,提问作者Steven Canales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:20:52