如何使用原生C#申请Google OAuth增量权限(scopes)
原生C#实现Gmail OAuth增量授权及同意页优化方案
一、无SDK实现增量授权流程
完全基于标准OAuth2.0协议实现,不需要依赖Google官方客户端库,用原生HttpClient即可完成所有逻辑:
- 首次授权阶段
- 构造授权请求时,
scope参数仅填写https://www.googleapis.com/auth/gmail.send单个权限,固定携带参数response_type=code、access_type=offline、prompt=consent,引导用户通过系统浏览器打开授权页 - 监听本地回环端口接收Google返回的授权码,调用token接口换取首次的access_token、refresh_token,持久化存储到本地
- 构造授权请求时,
- 增量授权阶段(获取用户邮箱权限)
- 重新构造授权请求,
scope参数仅填写新增的https://www.googleapis.com/auth/userinfo.email权限,额外携带参数include_granted_scopes=true、login_hint=已授权用户的账号标识,避免用户重复选择账号 - 同样通过本地回环端口接收新的授权码,调用token接口换取新的access_token,该token会自动合并之前已授予的邮件发送权限和新增的邮箱读取权限,不需要用户重复同意已授权内容
- 重新构造授权请求,
- 核心换token代码实现(原生C#)
using System.Net.Http; using System.Text.Json; // 自定义token返回结构,不需要引入第三方库 public class GoogleTokenResponse { public string access_token { get; set; } public string refresh_token { get; set; } public string scope { get; set; } public int expires_in { get; set; } } public async Task<GoogleTokenResponse> ExchangeToken(string authCode, string clientId, string clientSecret, string redirectUri) { using var httpClient = new HttpClient(); var formData = new Dictionary<string, string> { {"code", authCode}, {"client_id", clientId}, {"client_secret", clientSecret}, {"redirect_uri", redirectUri}, {"grant_type", "authorization_code"}, // 关键参数:自动合并历史已授予的所有权限 {"include_granted_scopes", "true"} }; var response = await httpClient.PostAsync("https://oauth2.googleapis.com/token", new FormUrlEncodedContent(formData)); response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync<GoogleTokenResponse>(); }
- 拿到新的access_token后,直接请求userinfo接口即可获取当前授权用户的邮箱地址,请求头携带
Authorization: Bearer {access_token}即可,不需要额外权限校验。
二、复现无勾选框、无未验证警告的同意页效果
你在Postman中看到的权限不可取消勾选、无未验证提示的效果,通过两个配置即可实现,不需要修改核心授权逻辑:
- 控制台配置:进入Google Cloud控制台的OAuth同意屏页面,将所有测试用的谷歌账号添加到「测试用户」列表,测试用户访问授权页时不会弹出“Google尚未验证此应用”的警告
- 请求参数配置:授权请求中不要携带
enable_serial_consent=true参数,只要请求的所有scope都已经在控制台同意屏的「已申请权限」列表中预先配置,授权页就不会出现可勾选的权限选项,所有请求的权限会默认强制授予 - 注意:不要在首次授权时同时请求跨敏感度等级的权限,
gmail.send属于敏感权限、userinfo.email属于基础权限,同时请求时Google会默认将高敏感权限设为未勾选状态,拆分为两次增量授权即可完全规避该问题。
内容的提问来源于stack exchange,提问作者J Ingersoll
相关产品推荐
相关产品推荐

