googleWebAuthorizationBroker.AuthorizeAsync永远挂起



我尝试使用youtube api v3和.NET将视频上传到youtube,但调用AuthorizeAsync永远挂起。您也可以在以下位置查看代码:https://developers.google.com/youtube/v3/code_samples/dotnet

  static void Main(string[] args)
     {
  Console.WriteLine("YouTube Data API: Upload Video");
  Console.WriteLine("==============================");
  try
  {
    new UploadVideo().Run().Wait();
  }
  catch (AggregateException ex)
  {
    foreach (var e in ex.InnerExceptions)
    {
      Console.WriteLine("Error: " + e.Message);
    }
  }
  Console.WriteLine("Press any key to continue...");
  Console.ReadKey();
}
private async Task Run()
{
  UserCredential credential;
  using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
  {
    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
        // This OAuth 2.0 access scope allows an application to upload files to the
        // authenticated user's YouTube channel, but doesn't allow other types of access.
        new[] { YouTubeService.Scope.YoutubeUpload },
        "user",
        CancellationToken.None
    );
  }
  var youtubeService = new YouTubeService(new BaseClientService.Initializer()
  {
    HttpClientInitializer = credential,
    ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
  });

我找到了解决方案。代码不起作用,因为应用程序托管在IIS上。IIS访问%appdata%文件夹中的文件夹时可能出现问题。令牌文件默认保存在%appdata%文件夹中。我尝试更改对该文件夹的权限。我添加了Everyone、DefaultAppPool、I_USER,。。。但没有成功。还有一个新版本的Google.Apis(1.8.2),它允许完整路径(新的FileDataStore(fullPath,true))true意味着完整路径,但即使在那里也有漏洞。不可能使用该构造函数,因为我总是会出错。所以我决定我的应用程序应该使用IIS Express(事实上,我创建了一个带有授权代码的新项目)。转到解决方案属性并设置应用程序使用IIS Express。

从获取cliendId(json文件)https://console.developers.google.com(选择web应用程序),并为javascript原点设置http://localhost:448372(或您的应用程序端口使用的任何端口),为重定向url设置http://localhost:48372/authorize.aspx。你还应该在互联网上找到如何使你的端口静态)。保存您的clientId文件。(这一步你可能已经完成了)当您使用IIS express时,AuthorizeAsync方法应该没有问题。系统将提示您输入凭据并选择您的youtube帐户(如果您已经登录,则只需选择帐户)。当您授予应用程序权限时,您将被重定向到authorize.aspx。您的authorize.aspx页面应使用提供的Client-Secret属性和DataStore属性创建新的IAuthorization流对象。使用code=Request.Params["code"]从URL读取代码并创建UserCredential对象。youtubeService的HttpClientInitializer属性的类型为UserCredential。您应该使用的方法类似于var usercredential=flow。SomeMethodWhichReceives("user",code,CancelletionToken.None)。之后,在您指定的FileDataStore文件夹中生成包含刷新令牌的文件。当您拥有刷新令牌时,您可以随心所欲,因为刷新令牌应该永远有效(除非手动撤销)。有一种方法可以从refreshtoken获取用户凭据,类似于flow。getAccessTokenfromRefreshToken("user","your_refresh_token_string")所以,当你有了刷新令牌并使用方法last方法时,你将能够访问谷歌youtube api。您还可以获得其他用户使用此方法上传到您的youtube帐户的可能性。如果你对用户在你账户上发布的内容持谨慎态度,你可以随时将他们上传的视频设为私人视频,并在验证时将其更改为公共视频。

google youtube api中的一些方法需要OAUTH2身份验证(从客户端机密获取刷新令牌->从刷新令牌获取访问令牌…),例如上传视频,但有些方法(如getvideos)不需要。您可以将API密钥提供给您的youtubeService编译器,而不是UserCredential

编辑:还有一件事我忘了提(对于那些认为这就是全部的人来说)。当你授予你的应用程序访问google api的权限时(就在你被reddirected授权.aspx之前),你会得到错误的redirect_url不匹配,因为url parametar redirect_url中有一个地方与你在ClientId json中提供的重定向url不匹配(至少出于某种原因,端口不同)。更改此parametar,使其与您在clientId json中提供的重定向url匹配。

我使用管理权限运行VS,这很有帮助。

最新更新