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

.NET C#控制台应用上传YouTube视频遇unauthorized_client错误

解决YouTube视频上传时的unauthorized_client授权异常

核心问题

unauthorized_client错误本质是刷新令牌、客户端ID/密钥、OAuth授权流程三者不匹配,比如刷新令牌不是用当前客户端凭证获取的,或授权流程缺少必要配置。

具体修复步骤

1. 对齐刷新令牌与客户端凭证

  • 打开Google云控制台,确认你使用的CLIENT_ID和CLIENT_SECRET所属项目已启用YouTube Data API v3
  • 重新在OAuth 2.0 Playground获取刷新令牌:
    • 进入Playground后点击右上角齿轮图标,勾选"使用自己的OAuth凭证",填入你的CLIENT_ID和CLIENT_SECRET
    • 选择权限范围https://www.googleapis.com/auth/youtube.upload,完成授权流程获取新的刷新令牌

2. 修正OAuth流程初始化代码

原代码中GoogleAuthorizationCodeFlow初始化缺少权限范围和离线访问配置,会导致令牌验证失败。修改后的BuildService方法如下:

private YouTubeService BuildService() 
{
    ClientSecrets secrets = new ClientSecrets()
    {
        ClientId = CLIENT_ID,
        ClientSecret = CLIENT_SECRET
    };

    var flowInitializer = new GoogleAuthorizationCodeFlow.Initializer
    {
        ClientSecrets = secrets,
        // 必须与授权时选择的权限范围一致
        Scopes = new[] { YouTubeService.Scope.YoutubeUpload },
        // 开启离线访问才能支持刷新令牌
        AccessType = "offline"
    };

    var token = new Google.Apis.Auth.OAuth2.Responses.TokenResponse { RefreshToken = REFRESH_TOKEN };
    // 第二个参数填授权用户的标识,不确定时可填"default"
    var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(flowInitializer), 
        "default", 
        token);

    var service = new YouTubeService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credentials,
        ApplicationName = "你的项目名称" // 需与云控制台的项目名称一致
    });

    service.HttpClient.Timeout = TimeSpan.FromSeconds(360); // 大视频上传建议设置超时
    return service;
}

3. 匹配客户端类型

  • 如果是桌面/控制台应用,云控制台中创建的OAuth客户端必须选择桌面应用类型,不能是Web应用
  • 如果是Web应用,客户端类型需选Web应用,授权流程也要对应匹配

4. 添加异常捕获方便调试

在UploadVideo方法中加入异常捕获,可获取更详细的错误信息:

public String UploadVideo(Stream stream, String title, String desc, String[] tags, String categoryId, Boolean isPublic)
{
    try
    {
        var video = new Video();
        video.Snippet = new VideoSnippet();
        video.Snippet.Title = title;
        video.Snippet.Description = desc;
        video.Snippet.Tags = tags;
        video.Snippet.CategoryId = categoryId;
        video.Status = new VideoStatus();
        video.Status.PrivacyStatus = isPublic ? "public" : "unlisted";

        var videosInsertRequest = youtube.Videos.Insert(video, "snippet,status", stream, "video/*");
        videosInsertRequest.ProgressChanged += insertRequest_ProgressChanged;
        videosInsertRequest.ResponseReceived += insertRequest_ResponseReceived;

        videosInsertRequest.Upload();

        return UploadedVideoId;
    }
    catch (TokenResponseException ex)
    {
        Console.WriteLine($"授权错误: {ex.Error.Message}, 详情: {ex.Error.Description}");
        return "AUTH_FAILED";
    }
    catch (Exception ex)
    {
        Console.WriteLine($"上传错误: {ex.Message}");
        return "FAILED";
    }
}

额外提醒

  • 确保你的Google账号拥有正常的YouTube频道,且未被限制API访问
  • 刷新令牌除非用户主动撤销授权或6个月未使用,否则不会过期,过期后需重新获取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:02:19