【发布时间】: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 帐户,我们都会保留文字字符串“用户”。我猜UserCredential 或GoogleWebAuthorizationBroker 的内部工作原理知道如何提取正确的数据,可能来自cookie(?),UploadAsync 函数将知道将视频上传到哪个帐户。
我还使用了GoogleWebAuthorizationBroker,而不是从头开始构建UserCredential 和Token(这导致了“过期令牌”消息)。
现在,我在拼命尝试后幸运地偶然发现了一件事情,那就是我需要设置一个其他类型的已安装应用程序(本机),它与 Web 应用程序是分开的。已安装的应用程序将拥有自己的一组客户端 ID 和客户端密码。使用这些凭据,上传成功了!
...但是有些事情是完全不对的。用户将被要求再次验证您的客户端应用程序 - 但将打开一个新选项卡以表示同意,当您单击接受(或确定)时,您将登陆一个空白页面,上面写着“收到访问代码” .您的上传确实发生了,但这是一个非常肮脏且无法接受的用户体验问题。
我仍然不满意,因为我认为我所做的事情是 hacky/错误的。
【问题讨论】:
-
我使用相同的代码将视频上传到我的帐户。它还打开浏览器以获取我的应用程序与我的帐户交互的授权。这对我来说很有意义 - 您不希望应用程序在未经您许可的情况下访问您的帐户 - 对吗?
-
正确。首先同意用户必须同意进入您的网络应用程序(客户端)(用于管理 YouTube 帐户和 Google+ 数据)。但是,当他们第一次单击您的上传按钮时,他们会看到将执行上传的服务器端应用程序的“离线访问权限”窗口 - 这一切都很好,但“离线访问”的措辞可能会吓到大多数用户。
-
问题是,我不能使用纯粹的客户端上传,因为我没有要求用户从他/她的机器上抓取文件上传到 YouTube。我让他们上传一个已经保存在属于他们的在线某个地方的文件。
标签: oauth youtube youtube-api youtube-data-api