Google OAuth2 - 用于令牌的Exchange访问代码 - 无法正常工作

时间:2014-01-15 14:06:24

标签: javascript oauth-2.0 google-oauth oauth2-playground youtube-analytics

我目前正在实施服务器端OAuth2流程以授权我的应用程序。

JS应用程序将代表注册的CMS帐户向最终用户(拥有与CMS帐户合作的渠道)显示YouTube Analytics数据。结果,授权阶段需要完全隐藏在用户之外。我试图授权一次,然后使用“永久”授权代码在需要时检索访问令牌。

我能够成功授权并检索访问代码。当我尝试交换令牌的访问代码时,问题就开始了。

实现此目的的HTTP POST请求看起来像这样......

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

我正在使用此代码来实现此目的:

var myPOSTRequest = new XMLHttpRequest();



myPOSTRequest.open('POST', 'https://accounts.google.com/o/oauth2/token', true);
myPOSTRequest.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
myPOSTRequest.send('code=' + myAuthCode + '&redirect_uri=http%3A%2F%2Flocalhost%2FCMSAuth3.html&client_id=626544306690-kn5m3vu0dcgb17au6m6pmr4giluf1cle.apps.googleusercontent.com&scope=&client_secret={my_client_secret}&grant_type=authorization_code');

我可以成功获得对该请求的200 OK响应,但是没有返回访问令牌,myPOSTRequest.responseText返回一个空字符串。

我玩过Google的OAuth Playground - 并且可以使用我自己的凭据成功获取令牌。

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:1)

你不能这样做,因为有same origin policy。这是现代浏览器的安全概念,它可以防止javascript从您的站点获取来自其他来源的响应。这是一个重要的概念,因为它为您提供了保护您免受CSRF保护的能力。所以不要使用代码授权流程,而是使用token authorization flow

答案 1 :(得分:1)

尝试并构建完整的网址。然后将其转储到webbrowser中。如果它的核心你将得到json回来。你有核心格式。

https://accounts.google.com/o/oauth2/token?code=<myAuthCode>&redirect_uri=<FromGoogleAPIS>&client_id=<clientID>&client_secret={my_client_secret}&grant_type=authorization_code

其他要检查的事项:

  1. 确保您使用的是google apis中设置的redirect_uri。
  2. 您如何获得Authcode?如果你从页面标题中删除它我遇到了问题而不是在标题中返回完整的authcode,请尝试检查页面的正文。这不会一直发生。我只是在国家。