我登录后,YouTube API请求无效

时间:2015-04-19 17:37:38

标签: angularjs http youtube-api cors yeoman-generator

我使用Yeoman的angular-fullstack生成器进行登录和身份验证。

当我发布用于身份验证的代码并发出YouTube API请求时,它可以完美运行。但是,当我取消注释身份验证代码,登录并生成相同的YouTube API请求时,它无法正常工作。

这里发生了什么:

enter image description here

它以某种方式向两次提出相同的API请求(到videos?part=...)。当我没有登录时,它只发生一次。

所以第一个成功:

enter image description here

但第二个是不成功的:

enter image description here

我有两个问题:

1)为什么要生成第二个HTTP请求?

以下是用于发出请求的代码的摘录:

console.log('before request');
$http.get('https://www.googleapis.com/youtube/v3/videos?part=snippet%2C+contentDetails&id='+videoId+'&key='+API_KEY)
  .success(function(result) {
    console.log('success');
    var item = result.items[0];
    vm.skim.title = item.snippet.title;
    vm.skim.description = item.snippet.description;

"在请求之前"只记录一次,我无法弄清楚生成第二个HTTP请求的内容。

2)为什么第二个HTTP请求不成功?请求之间的唯一区别似乎是Authorization标头。我对此并不了解,但它似乎是一个request with credentials,根据我的理解,响应有access-control-allow-credentials: true的事实应该可以使这个工作。

我不确定我应该发布什么代码,所以here就是GitHub上的所有代码。

编辑:当我注释掉授权代码时,这是一个成功的请求。

enter image description here

1 个答案:

答案 0 :(得分:1)

第一个请求是“预检请求”:OPTION请求以确保远程服务器允许您发出真实请求(浏览器需要access-control-allow-origin)。在尝试记录查询时只有它,这似乎很奇怪,但这可能是access-control-max-age的副作用:此预检请求的缓存持续时间。

第二个请求是真实的POSTGoogle documentation说:

  

如果您提交访问受保护资源的请求,则API会返回HTTP 401响应代码(未授权),该访问令牌已过期,出现故障,范围不正确或因某些其他原因无效。

您应该查看“调用YouTube数据API”部分,看看您的令牌是否有效以及sample request是否有效。

关于access-control-allow-credentials:默认行为是发送任何Cookie(并且不会没有此标头),您可以使用$http.get('...', {withCredentials: true})发送它们。