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

如何在.NET Core控制台应用中生成OAuth 2.0同意屏授权URL

.NET Core控制台应用实现Google OAuth2.0同意屏授权的两种方案

两种方案均不依赖已废弃的GData库,完全适配原生.NET Core运行环境。


方案1:使用Google官方维护的认证库实现(推荐,最省心)

该库为Google官方当前迭代的稳定认证组件,和废弃的GData系列没有关联,适配全版本.NET Core。

  • 先安装NuGet包:Install-Package Google.Apis.Auth
  • 代码实现:
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using System.Diagnostics;

// 自定义配置参数
string clientId = "你的Google客户端ID";
string clientSecret = "你的Google客户端密钥";
string[] scopes = { "你需要申请的权限Scope,如YouTube API对应权限" };
string userIdentify = "default_user"; // 本地缓存凭证的用户标识,可自定义

// 内部自动完成授权URL生成、浏览器唤起、授权码接收、Token兑换全流程
var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
    new ClientSecrets
    {
        ClientId = clientId,
        ClientSecret = clientSecret
    },
    scopes,
    userIdentify,
    CancellationToken.None,
    new NullFileDataStore()); // 不需要本地缓存Token可传NullFileDataStore,需要缓存可替换为FileDataStore指定存储路径

// 直接获取最终凭证
string accessToken = credential.Token.AccessToken;
string refreshToken = credential.Token.RefreshToken;

方案2:纯原生手动实现,无任何第三方Google相关依赖

完全按照OAuth2.0标准流程手动构造请求,和你之前使用GData的逻辑完全对齐。

第一步:生成授权同意屏URL

// 自定义配置参数
string clientId = "你的Google客户端ID";
string redirectUri = "urn:ietf:wg:oauth:2.0:oob"; // 桌面应用专用回调地址,授权后会直接在浏览器显示授权码
string scope = "你需要申请的权限Scope";

// 拼接授权URL,要获取refresh_token必须加access_type=offline参数
var authUrl = $"https://accounts.google.com/o/oauth2/v2/auth?" +
    $"client_id={Uri.EscapeDataString(clientId)}" +
    $"&redirect_uri={Uri.EscapeDataString(redirectUri)}" +
    $"&scope={Uri.EscapeDataString(scope)}" +
    $"&response_type=code" +
    $"&access_type=offline";

// 输出URL或直接唤起系统默认浏览器打开
Console.WriteLine($"请打开以下地址完成授权:{authUrl}");
Process.Start(new ProcessStartInfo(authUrl) { UseShellExecute = true });

第二步:用授权码兑换访问令牌和刷新令牌

Console.WriteLine("请输入浏览器中返回的授权码:");
string authCode = Console.ReadLine().Trim();
string clientSecret = "你的Google客户端密钥";

using var httpClient = new HttpClient();
// 构造Token兑换请求参数
var tokenRequestParams = new Dictionary<string, string>
{
    {"code", authCode},
    {"client_id", clientId},
    {"client_secret", clientSecret},
    {"redirect_uri", redirectUri},
    {"grant_type", "authorization_code"}
};

var response = await httpClient.PostAsync(
    "https://oauth2.googleapis.com/token", 
    new FormUrlEncodedContent(tokenRequestParams));
response.EnsureSuccessStatusCode();

// 解析返回的Token结果
var tokenResult = System.Text.Json.JsonSerializer.Deserialize<TokenResponse>(await response.Content.ReadAsStringAsync());
string accessToken = tokenResult.access_token;
string refreshToken = tokenResult.refresh_token;

// Token返回结果实体类定义
public class TokenResponse
{
    public string access_token { get; set; }
    public string refresh_token { get; set; }
    public int expires_in { get; set; }
    public string token_type { get; set; }
    public string scope { get; set; }
}

注意事项

  • 在谷歌云后台创建客户端ID时,应用类型必须选择桌面应用,否则会出现回调地址不匹配的错误
  • access_type=offline参数是获取refresh_token的必要条件,且refresh_token仅在用户第一次授权时返回,后续重复授权不会返回,需自行妥善保存

内容的提问来源于stack exchange,提问作者Maksym Khomiak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:06:02