2

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

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

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

实现此目的的 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 - 并且可以使用我自己的凭据成功获取令牌。

我在这里错过了什么吗?

4

2 回答 2

1

你不能这样做,因为有相同的原产地政策。这是现代浏览器的一个安全概念,它可以防止 javascript 从您的站点之外的其他来源获取响应。这是一个重要的概念,因为它使您能够保护您免受CSRF的侵害。所以不要使用代码授权流程,而是使用令牌授权流程

于 2014-01-15T16:04:36.540 回答
1

尝试构建完整的 URL。然后将其转储到网络浏览器中。如果它正确,您将获得 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,请尝试检查页面的正文。这不会一直发生。我只是偶尔。
于 2014-01-16T08:18:18.140 回答