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

如何使用原生C#申请Google OAuth增量权限(scopes)

原生C#实现Gmail OAuth增量授权及同意页优化方案

一、无SDK实现增量授权流程

完全基于标准OAuth2.0协议实现,不需要依赖Google官方客户端库,用原生HttpClient即可完成所有逻辑:

  • 首次授权阶段
    1. 构造授权请求时,scope参数仅填写https://www.googleapis.com/auth/gmail.send单个权限,固定携带参数response_type=code、access_type=offline、prompt=consent,引导用户通过系统浏览器打开授权页
    2. 监听本地回环端口接收Google返回的授权码,调用token接口换取首次的access_token、refresh_token,持久化存储到本地
  • 增量授权阶段(获取用户邮箱权限)
    1. 重新构造授权请求,scope参数仅填写新增的https://www.googleapis.com/auth/userinfo.email权限,额外携带参数include_granted_scopes=true、login_hint=已授权用户的账号标识,避免用户重复选择账号
    2. 同样通过本地回环端口接收新的授权码,调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:15:38