.NET C#控制台应用上传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,完成授权流程获取新的刷新令牌
- 进入Playground后点击右上角齿轮图标,勾选"使用自己的OAuth凭证",填入你的
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
相关产品推荐
相关产品推荐

