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

Oauth 如何使用访问令牌上传到YouTube v3?,oauth,youtube,youtube-api,youtube-data-api,Oauth,Youtube,Youtube Api,Youtube Data Api,我在一个web应用程序上通过了OAuth并获得了访问令牌 现在,我想我应该使用这个访问令牌来上传视频,但API v3似乎不允许我使用它。我在看。特别是,我觉得这句话很奇怪: UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, new[] { "YouTubeService.Scope.YoutubeUpload" },

我在一个web应用程序上通过了OAuth并获得了访问令牌

现在,我想我应该使用这个访问令牌来上传视频,但API v3似乎不允许我使用它。我在看。特别是,我觉得这句话很奇怪:

UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets,
                new[] { "YouTubeService.Scope.YoutubeUpload" },
                "user",
                CancellationToken.None);
第三个参数是用户名。我没有从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.getExecutionGassembly().GetName().Name

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

很抱歉,如果我问了一些明显的问题,但是官方文件没有告诉我任何事情,也没有回答类似的问题。请帮忙


更新:

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

我发现不管谁登录到他/她的谷歌帐户,我们都会保留文字字符串“user”。我猜
UserCredential
GoogleWebAuthorizationBroker
的内部工作机制知道如何从cookie(?)中提取正确的数据,并且
UploadAsync
函数将知道将视频上传到哪个帐户

我还使用了
GoogleWebAuthorizationBroker
,而不是从头开始构建
UserCredential
Token
(这导致了“过期的Token”消息)

现在,我在拼命尝试之后幸运地发现,我需要安装一个类型为Other的已安装应用程序(本机),它与web应用程序是分开的。安装的应用程序将有自己的一组客户端id和客户端密码。使用这些凭证,上传成功了

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


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

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

token.Issued = DateTime.Now;
token.ExpiresInSeconds = int.MaxValue;
这是一个黑客,但它的工作就像一个魅力!.net客户端的作者似乎认为您总是有一个刷新令牌,因为他们使单独使用访问令牌变得困难。java和python库在这方面更加直观


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

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