【问题标题】:googleWebAuthorizationBroker.AuthorizeAsync hangs forevergoogleWebAuthorizationBroker.AuthorizeAsync 永远挂起
【发布时间】:2014-09-02 17:37:20
【问题描述】:

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

【问题讨论】:

    标签: .net youtube youtube-api


    【解决方案1】:

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

    https://console.developers.google.com(选择 Web 应用程序)获取 cliendId(json 文件)并为 javascript 源和 http://localhost:48372/authorize.aspx 设置 http://localhost:48372(或您使用的任何应用程序端口)用于重定向网址。您还应该在互联网上找到如何使您的端口静态)。保存您的 clientId 文件。 (这一步你可能已经做过了) 当您使用 IIS express 时, AuthorizeAsync 方法应该没有问题。系统将提示您输入凭据并选择您的 youtube 帐户(如果您已经登录,则只需选择帐户)。当您授予您的应用权限时,您将被重定向到 authorize.aspx。您的授权 aspx 页面应创建新的 IAuthorization 流对象,并提供 Client Secret 属性和 DataStore 属性。使用 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") 因此,当您拥有刷新令牌并使用最后一种方法时,您将能够访问 google youtube api。您还可以使用这种方法将其他用户上传到您的 youtube 帐户。如果您对用户在您的帐户中添加的内容有所了解,您可以随时将他们上传的视频设为私有,并在您验证它们时将其更改为公开。

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

    编辑:还有一个我忘了提的问题(对于那些认为这就是全部的人)。当您授予应用访问 google api 的权限时(就在您被重定向到 authorize.aspx 之前),您将收到错误 redirect_url mismatch,因为 url 参数 redirect_url 中的某个位置与您在 ClientId 中提供的重定向 url 不匹配json,(端口不同,至少,出于某种原因)。更改此参数,使其与您在 clientId json 中提供的重定向 url 匹配。

    【讨论】:

      【解决方案2】:

      我以管理员权限运行 VS,它有所帮助。

      【讨论】:

      • 我一直在运行,但对我来说,问题是因为当我使用 IIS 时,方法就挂了。然后我切换到 IIS express 只是为了获取该令牌并稍后在我托管在 IIS 上的应用程序中使用它。
      猜你喜欢
      • 2015-02-18
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多