【问题标题】:How to Upload To YouTube v3 using Access Token?如何使用访问令牌上传到 YouTube v3?
【发布时间】:2015-06-12 08:02:20
【问题描述】:

我已经在 Web 应用程序上通过 OAuth 并获得了访问令牌...

现在,我认为我应该使用该访问令牌来上传视频,但 API v3 似乎不允许我使用它。我在看YouTube Data API: .NET code samples。特别是,这行对我来说似乎很奇怪:

UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets,
                new[] { "YouTubeService.Scope.YoutubeUpload" },
                "user",
                CancellationToken.None);

第三个参数user,我猜是用户名。我没有从 OAuth2 响应中获得该信息。我什至不知道什么是 YouTube 用户名 - 当我查看人们的 YT 个人资料时,我只会看到显示名称,而且这些显示名称并不是唯一的。这第三个参数是什么?

函数名称AuthorizeAsync 意味着我们还没有获得授权——但是为什么首先要通过OAuth呢?拥有访问令牌意味着用户已经授权我们的应用上传。

我还发现了能够传递访问令牌的可能性:

var token = new TokenResponse() 
            { 
                AccessToken = "xm239jjks9f98900....."
            };

            UserCredential credential = new UserCredential(new GoogleAuthorizationCodeFlow(
                new GoogleAuthorizationCodeFlow.Initializer 
                { 
                    ClientSecrets = secrets
                }
                ), "userId", token);

            //GoogleAuthorizationCodeFlow
            YouTubeService youTubeService = new YouTubeService(new BaseClientService.Initializer() 
            { 
                HttpClientInitializer = credential,
                ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
            });

仅凭“TokenResponse”的名称似乎我不应该明确构建它。另外,GoogleAuthorizationCodeFlow.Initializer 有 userId 的参数,哪个增益,我不知道,因为 OAuth2 没有给我。

BaseClientService.Initializer() 也有ApplicationName,这是什么?我不认为是 Assembly.GetExecutingAssembly().GetName().Name,因为我是从某个地方复制的。

我尝试运行上面的代码,但收到错误“访问令牌已过期,但我们无法刷新它” - 但用户刚刚在最后几秒钟内登录,因此访问令牌是新的。

很抱歉,如果我问的是明显的问题,但官方文档没有告诉我任何事情,并且与我在 SO 上所问的类似问题仍未得到解答。请帮忙!


更新:

在我的例子中,所有代码都驻留在定制的 Web API 函数中,但我认为它在任何服务器端页面 (.aspx.cs) 或 MVC 控制器上都可以正常工作。

我发现无论谁可能登录到他/她的 Google 帐户,我们都会保留文字字符串“用户”。我猜UserCredentialGoogleWebAuthorizationBroker 的内部工作原理知道如何提取正确的数据,可能来自cookie(?),UploadAsync 函数将知道将视频上传到哪个帐户。

我还使用了GoogleWebAuthorizationBroker,而不是从头开始构建UserCredentialToken(这导致了“过期令牌”消息)。

现在,我在拼命尝试后幸运地偶然发现了一件事情,那就是我需要设置一个其他类型的已安装应用程序(本机),它与 Web 应用程序是分开的。已安装的应用程序将拥有自己的一组客户端 ID 和客户端密码。使用这些凭据,上传成功了!

...但是有些事情是完全不对的。用户将被要求再次验证您的客户端应用程序 - 但将打开一个新选项卡以表示同意,当您单击接受(或确定)时,您将登陆一个空白页面,上面写着“收到访问代码” .您的上传确实发生了,但这是一个非常肮脏且无法接受的用户体验问题。

我仍然不满意,因为我认为我所做的事情是 hacky/错误的。

【问题讨论】:

  • 我使用相同的代码将视频上传到我的帐户。它还打开浏览器以获取我的应用程序与我的帐户交互的授权。这对我来说很有意义 - 您不希望应用程序在未经您许可的情况下访问您的帐户 - 对吗?
  • 正确。首先同意用户必须同意进入您的网络应用程序(客户端)(用于管理 YouTube 帐户和 Google+ 数据)。但是,当他们第一次单击您的上传按钮时,他们会看到将执行上传的服务器端应用程序的“离线访问权限”窗口 - 这一切都很好,但“离线访问”的措辞可能会吓到大多数用户。
  • 问题是,我不能使用纯粹的客户端上传,因为我没有要求用户从他/她的机器上抓取文件上传到 YouTube。我让他们上传一个已经保存在属于他们的在线某个地方的文件。

标签: oauth youtube youtube-api youtube-data-api


【解决方案1】:

我遇到了这个确切的问题。通过检查代码,我发现您可以通过在 TokenResponse 上设置 Issued 和 ExpiresInSeconds 属性来解决该问题:

token.Issued = DateTime.Now;
token.ExpiresInSeconds = int.MaxValue;

这是一个 hack,但它就像一个魅力! .net 客户端的作者似乎假设您将始终拥有一个刷新令牌,因为他们很难单独使用访问令牌。在这方面,java 和 python 库要直观得多。

您为用户字符串传递的内容似乎并不重要。

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 2013-05-03
    • 2014-04-18
    • 2016-06-22
    • 2013-09-22
    • 1970-01-01
    • 2012-12-20
    • 2015-06-08
    相关资源
    最近更新 更多