.NET连接Google Drive API时OAuth2 redirect_uri不匹配400错误求助
解决Google Drive API OAuth2 redirect_uri动态变化导致的400错误
核心问题分析
你使用LocalServerCodeReceiver时,仅传入完整RedirectUri的方式未正确绑定固定端口,再加上旧缓存凭据的干扰,导致每次生成的回调URL动态变化。以下是针对性解决方案:
解决方案步骤
1. 正确初始化固定端口的LocalServerCodeReceiver
替换原代码中LocalServerCodeReceiver的初始化方式,明确指定端口、主机和路径,确保临时HTTP服务器监听固定端口:
// 定义固定端口和路径 const int RedirectPort = 61930; const string RedirectPath = "/authorize/"; // 初始化固定端口的代码接收器 var codeReceiver = new LocalServerCodeReceiver(RedirectPort, "localhost", RedirectPath, true);
然后在AuthorizeAsync中使用这个codeReceiver:
credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore("TokenStore"), codeReceiver).Result;
2. 清理旧凭据缓存
删除项目中TokenStore文件夹(或用户目录下关联的.credentials文件夹),清除之前缓存的动态端口凭据,确保重新授权时使用新的固定redirect_uri。
3. 验证Google Cloud Console配置
确保在Google Cloud Console的OAuth2客户端设置中,添加的重定向URI与代码定义的完全一致:http://localhost:61930/authorize/
注意:末尾的斜杠必须保留,URI的每一部分都要精确匹配。
4. 控制台项目无需配置web.config/appsettings端口
你的项目是控制台应用,web.config或appsettings.json中的端口设置仅针对Web项目生效,控制台项目的临时HTTP服务器端口由代码中LocalServerCodeReceiver的参数直接控制,无需额外配置。
修改后的完整代码片段
public static void Drive() { try { UserCredential credential; const int RedirectPort = 61930; const string RedirectPath = "/authorize/"; var codeReceiver = new LocalServerCodeReceiver(RedirectPort, "localhost", RedirectPath, true); using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) { credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore("TokenStore"), codeReceiver).Result; } // Create Drive API service. var service = new DriveService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = ApplicationName, }); // Define parameters of request. FilesResource.ListRequest listRequest = service.Files.List(); listRequest.PageSize = 10; listRequest.Fields = "nextPageToken, files(id, name)"; // List files. IList<Google.Apis.Drive.v3.Data.File> files = listRequest.Execute() .Files; Console.WriteLine("Files:"); if (files != null && files.Count > 0) { foreach (var file in files) { Console.WriteLine("{0} ({1})", file.Name, file.Id); } } else { Console.WriteLine("No files found."); } Console.Read(); } catch (Exception e) { throw e; } }
内容的提问来源于stack exchange,提问作者Albert Cabello
相关产品推荐
相关产品推荐

