googleWebAuthorizationBroker.AuthorizeAsync永远挂起

时间:2014-09-02 17:37:20

标签: .net youtube youtube-api

我尝试使用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
  });

2 个答案:

答案 0 :(得分:1)

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

https://console.developers.google.com获取cliendId(json文件)(选择Web应用程序)并为javascript起源设置http:// localhost:48372(或您的应用程序端口使用的任何内容)和http:// localhost:48372 / authorize .aspx用于重定向网址。您还应该在互联网上找到如何使您的端口静态)。保存您的clientId文件。 (这个步骤你可能已经做过了) 当您使用IIS express时,AuthorizeAsync方法应该没有问题。您将被要求输入您的凭据并选择您的YouTube帐户(或者如果您已经进入帐户,则选择帐户)。当您授予应用程序权限时,您将被重定向到authorize.aspx。您的授权aspx页面应该创建新的IAuthorization流对象,并提供Client Secret属性和DataStore proprty。使用code = Request.Params [" code"]从URL读取代码并创建UserCredential对象.youtubeService的HttpClientInitializer属性属于UserCredential类型。您应该使用的方法类似于var usercredential = flow.SomeMethodWhichReceives(" user",code,CancelletionToken.None)。之后,在您指定的FileDataStore文件夹中生成包含刷新令牌的文件。 当你有刷新令牌时,你可以做任何你想做的事情,因为刷新令牌应该永远持续(除非手动撤销)。有一种方法允许从refreshtoken获取usercredential,比如flow.getAccessTokenfromRefreshToken(" user"," your_refresh_token_string") 因此,当您拥有刷新令牌并使用方法last方法时,您将能够访问google youtube api。您也可以使用此方法将其他用户上传到您的YouTube帐户。如果您认为用户在您的帐户中添加了内容,您可以随时制作他们上传的视频,并在验证后将其更改为公开。

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

编辑:还有一个我忘记提及的问题(对于那些认为这一切的人)。如果您授予应用访问google api的权限(在您被重定向到authorize.aspx之前),则会出现错误redirect_url不匹配,因为url parametar redirect_url中的某个位置与您在ClientId中提供的重定向网址不匹配json,(端口是不同的,至少,由于某种原因)。更改此参数,以便与您在clientId json中提供的重定向URL匹配。

答案 1 :(得分:0)

我使用管理员权限运行VS并且它有所帮助。