.NET - 如何使用 OAuth2.0 和 Windows 服务的离线访问将视频上传到 YouTube

Posted

技术标签:

【中文标题】.NET - 如何使用 OAuth2.0 和 Windows 服务的离线访问将视频上传到 YouTube【英文标题】:.NET - How to upload videos to YouTube using OAuth2.0 and Offline Access from a Windows Service 【发布时间】:2018-11-27 05:47:41 【问题描述】:

我正在使用从 Nuget 下载的 Youtube .Net 库。

我创建了一个 Windows 服务,它正在检查一个文件夹以将新视频上传到 youtube。我使用控制台应用程序进行了测试,在这种情况下,用户必须在网络浏览器上手动进行授权,之后我可以毫无问题地将视频上传到 youtube。问题是当我尝试使用离线访问时。

当我在 Windows 服务上运行我的代码时,我无法从用户那里获得手动授权,所以我按照这个答案创建了我的访问令牌:https://***.com/a/20689423/2277059

问题是我没有找到任何使用独立版本的代码示例,所以我有点迷茫。使用我当前的代码,我在尝试上传视频时总是遇到错误:“unauthorized_client”。您可以在我的代码“client_secrets.json”中看到的 JSON 文件是您在为 YouTube API V3 创建凭据时自动生成的文件。

我也试过这个:https://***.com/a/43895931/2277059,但得到了同样的错误。

现在我没有从代码中刷新令牌,只是在 OAuth Playground 上进行并测试服务。一旦成功,我将研究如何在每次查询时刷新令牌。

创建凭据时,我选择了“其他”类型,因为这是 Windows 服务。

是我的代码有问题还是我在配置中遗漏了什么?

这是我的代码:

var token = new TokenResponse()

    AccessToken = "werwdsgfdg...",
    ExpiresInSeconds = 3600,
    RefreshToken = "3/dsdfsf...",
    TokenType = "Bearer"
;

Log.Info("Generating user credentials and secrets");

UserCredential credential;
string credentialsPath = System.AppDomain.CurrentDomain.BaseDirectory + "client_secrets.json";

using (var stream = new FileStream(credentialsPath, FileMode.Open, FileAccess.Read))

    credential = new UserCredential(new GoogleAuthorizationCodeFlow(
    new GoogleAuthorizationCodeFlow.Initializer
    
        ClientSecrets = GoogleClientSecrets.Load(stream).Secrets,
        Scopes = new[]  YouTubeService.Scope.YoutubeUpload 
    
    ), EsSettings.YoutubeUser, token);



Log.Info("Generating youtube service");
//GoogleAuthorizationCodeFlow
YouTubeService youtubeService = new YouTubeService(new BaseClientService.Initializer()

    HttpClientInitializer = credential,
    ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
);


Log.Info("Uploading...");
using (var fileStream = new FileStream(filePath, FileMode.Open))


    var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*");
    videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
    videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;


    await videosInsertRequest.UploadAsync();

【问题讨论】:

【参考方案1】:

错误:“unauthorized_client”

表示你发送的客户端id没有经过用户认证。

你得到这个的原因是因为你正在这样做

现在我没有从代码中刷新令牌,只是在 OAuth Playground 上执行它并测试服务。一旦成功,我将研究如何在每次查询时刷新令牌。

令牌与客户端相关联。您的 client_secrets.json 文件包含您的客户端,但您从 oauth 游乐场抓取的令牌与该客户端无关。

您应该在自己的机器上运行一次代码来验证它。检查可以在您的 %appData% 文件夹中找到的凭据文件以获取访问令牌和刷新令牌,然后将它们发送到您的令牌。

这是文件应该包含的内容。

  
   "access_token":"ya29.4wEk2VsbqiPfR4oH5WaYo7aYgAmlP2KSIl-heyDnPBBHMYYKnfU6YuQ-_RsDofD8QR1T",
   "token_type":"Bearer",
   "expires_in":3600,
   "refresh_token":"1/PSvxzxGB-3XU8bF2SrG6llzO-ZizE4mftrd9Edqbubg",
   "Issued":"2015-09-03T11:43:47.681+02:00"

你可以在这里FileDatastore阅读文件是如何创建的

【讨论】:

好的,首先,感谢您抽出宝贵时间。如果我理解这些步骤应该如下: 1. 在我的机器上运行我的控制台应用程序,以便我可以进行手动授权 2. 从 %appdata% 获取令牌文件并在我的 Windows 服务上设置令牌 3. 设置我的 Windows 服务使用该令牌并在每次调用时刷新令牌 4. 我可以将我的服务移至 prod。与此同时,我将研究如何使用 .NET 库刷新令牌。 访问令牌过期后,您无需刷新客户端库将为您执行此操作的令牌。 它会自动刷新!有时,我在重用令牌之前等待了几天,并且它总是自动刷新。请参阅 [github.com/google/google-api-dotnet-client-samples][1] 上的 ResumeableUpload 示例。 [1]:github.com/google/google-api-dotnet-client-samples 好的,伙计们,明白了。我将尝试整个过程,我会告诉你。非常感谢。 一切都好,我按照你说的做了,一切正常。谢谢你们俩。

以上是关于.NET - 如何使用 OAuth2.0 和 Windows 服务的离线访问将视频上传到 YouTube的主要内容,如果未能解决你的问题,请参考以下文章

在ASP.NET中实现OAuth2.0之了解OAuth

.net Core2.2 WebApi通过OAuth2.0实现微信登录

2021-06-27 .NET高级班 71-ASP.NET Core Identityserver4(OAuth2.0模式)

在ASP.NET中实现OAuth2.0之打造自己的API安全策略

如何使用 OAuth2.0 生成 XOAUTH 参数以与 Gmail IMAP 协议一起使用?

OAuth2.0学习(1-13)OAuth2.0的投票机制和投票器