.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列表。
具体实现步骤:
配置验证规则
创建GoogleJsonWebSignature.ValidationSettings实例,将你的client_id(支持多个,比如Web、移动端不同的客户端ID)添加到Audience集合中。调用带参数的验证方法
使用重载的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
相关产品推荐
相关产品推荐

