C# Web API后端如何用Google Access Token调用API获取用户信息
在C# Web API后端调用Google用户信息接口的实现方案
下面提供两种可行的实现方式,从简单直接到规范可靠,你可以根据需求选择:
方式一:使用HttpClient直接调用(轻量快捷)
这种方式模拟前端请求逻辑,直接通过HttpClient调用Google的用户信息接口:
实现步骤
- 确保项目中已注入HttpClient(ASP.NET Core默认支持依赖注入)
- 编写API接口,接收并验证Access Token,构造请求获取用户信息
代码示例
using Microsoft.AspNetCore.Mvc; using System.Net.Http; using System.Threading.Tasks; using System; [ApiController] [Route("api/google")] public class GoogleAuthController : ControllerBase { private readonly HttpClient _httpClient; public GoogleAuthController(HttpClient httpClient) { _httpClient = httpClient; } [HttpGet("userinfo")] public async Task<IActionResult> GetUserInfo() { // 从请求头获取Access Token(推荐用这种方式,比URL参数更安全) var authHeader = Request.Headers["Authorization"].ToString(); if (!authHeader.StartsWith("Bearer ")) { return BadRequest("无效的授权头格式"); } var accessToken = authHeader.Substring("Bearer ".Length); if (string.IsNullOrEmpty(accessToken)) { return BadRequest("Access Token不能为空"); } // 安全构造请求URL(避免编码问题) var uriBuilder = new UriBuilder("https://www.googleapis.com/oauth2/v1/userinfo"); var queryParams = System.Web.HttpUtility.ParseQueryString(uriBuilder.Query); queryParams["alt"] = "json"; queryParams["access_token"] = accessToken; uriBuilder.Query = queryParams.ToString(); var response = await _httpClient.GetAsync(uriBuilder.Uri); if (!response.IsSuccessStatusCode) { return StatusCode((int)response.StatusCode, "获取用户信息失败"); } var userInfo = await response.Content.ReadAsStringAsync(); return Ok(userInfo); } }
注意事项
- 优先通过
Authorization请求头传递token,避免URL参数泄露风险 - 需处理token过期、无效等异常情况(比如返回401时提示前端重新授权)
方式二:使用Google官方SDK(规范可靠)
Google提供了官方的.NET SDK,能自动处理token验证、请求签名等逻辑,适合生产环境使用:
实现步骤
- 安装NuGet包:
Install-Package Google.Apis.Auth Install-Package Google.Apis.Oauth2.v2 - 编写API接口,通过SDK调用用户信息接口
代码示例
using Google.Apis.Oauth2.v2; using Google.Apis.Services; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; [ApiController] [Route("api/google")] public class GoogleAuthController : ControllerBase { [HttpGet("userinfo-official")] public async Task<IActionResult> GetUserInfoWithOfficialSdk() { // 从请求头获取Access Token var authHeader = Request.Headers["Authorization"].ToString(); if (!authHeader.StartsWith("Bearer ")) { return BadRequest("无效的授权头格式"); } var accessToken = authHeader.Substring("Bearer ".Length); if (string.IsNullOrEmpty(accessToken)) { return BadRequest("Access Token不能为空"); } // 初始化Google OAuth2服务 var credential = Google.Apis.Auth.OAuth2.GoogleCredential.FromAccessToken(accessToken); var oauth2Service = new Oauth2Service(new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "你的应用名称" // 填写你的应用名称 }); // 调用用户信息接口 var userInfo = await oauth2Service.Userinfo.Get().ExecuteAsync(); // 返回结构化的用户信息 return Ok(new { UserId = userInfo.Id, Email = userInfo.Email, FullName = userInfo.Name, AvatarUrl = userInfo.Picture }); } }
注意事项
- 官方SDK会自动处理请求的合法性验证,比直接调用更安全
- 如果你的授权流程获取了Refresh Token,还可以借助SDK实现token自动刷新
- 确保在Google Cloud Console中已启用OAuth2 API(一般默认启用,若未启用需手动开启)
内容的提问来源于stack exchange,提问作者Modestas Vacerskas
相关产品推荐
相关产品推荐

