如何使用访问令牌上传到YouTube v3?

时间:2015-04-07 16:24:04

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

我已经在网络应用程序上浏览了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
            });

仅仅是#34; TokenResponse"的名称好像我不应该明确地构建它。另外,GoogleAuthorizationCodeFlow.Initializer有userId的参数,我不知道因为OAuth2没有给我这个参数。

BaseClientService.Initializer()还有ApplicationName,这是什么?当我从某个地方复制时,我不会认为它是Assembly.GetExecutingAssembly().GetName().Name

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

很抱歉,如果我问一些明显的事情,但官方文档并没有告诉我任何与我在此处提出的问题类似的问题仍未得到答复。请帮忙!


更新:

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

我发现我们要保留文字字符串" user"无论谁登录他/她的Google帐户。我想UserCredentialGoogleWebAuthorizationBroker的内部工作方式知道如何从Cookie(?)中提取正确的数据,而UploadAsync函数会知道将视频上传到哪个帐户

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

现在,我在拼命尝试任何事情后偶然发现的事情是,我需要设置一个类型为Other的已安装应用程序(Native),它是Web应用程序的SEPARATE。已安装的应用程序将拥有自己的客户端ID和客户端密钥。使用这些凭据,上传工作!

......但有些事情是不对的。系统会要求用户再次验证您的客户端应用程序 - 但是会有一个新的选项卡打开以获得该同意,当您单击“接受”(或“确定”)时,您将找到一个类似于&#34的空白页面;收到访问代码"。您的上传确实发生了,但这是一个非常肮脏和不可接受的用户体验问题。

我仍然不满意,因为我认为我做的是黑客/错误。

1 个答案:

答案 0 :(得分:0)

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

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

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

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