如何在.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
相关产品推荐
相关产品推荐

