我目前正在实施服务器端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 - 并且可以使用我自己的凭据成功获取令牌。
我在这里错过了什么吗?
答案 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
其他要检查的事项: