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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:27:52