Javascript Google OAuth2-交换令牌访问代码-不工作

Javascript Google OAuth2-交换令牌访问代码-不工作,javascript,oauth-2.0,google-oauth,oauth2-playground,youtube-analytics,Javascript,Oauth 2.0,Google Oauth,Oauth2 Playground,Youtube Analytics,我目前正在实现服务器端OAuth2流,以便授权我的应用程序 JS应用程序将代表注册的CMS帐户向最终用户(拥有与CMS帐户合作的频道)显示YouTube分析数据。因此,需要对用户完全隐藏授权阶段。我尝试授权一次,然后在需要时使用“永久”授权代码检索访问令牌 我能够成功授权并检索访问代码。当我尝试将访问代码交换为令牌时,问题就开始了 实现此目的的HTTP POST请求需要如下所示 POST /o/oauth2/token HTTP/1.1 Host: accounts.google.com Con

我目前正在实现服务器端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返回空字符串

我已经玩过谷歌的OAuth游乐场,并且可以使用我自己的凭证成功地获得代币


我在这里遗漏了什么吗?

你不能这样做,因为这里有。这是现代浏览器的一个安全概念,它阻止javascript从其他来源(而不是您的站点)获取响应。这是一个重要的概念,因为它让你有能力保护自己免受伤害。因此,不要使用代码授权流,而是使用。

尝试构建完整的URL。然后把它倒进网络浏览器里。如果它是正确的,您将获得json。你有corect格式

https://accounts.google.com/o/oauth2/token?code=<myAuthCode>&redirect_uri=<FromGoogleAPIS>&client_id=<clientID>&client_secret={my_client_secret}&grant_type=authorization_code
https://accounts.google.com/o/oauth2/token?code=&redirect_uri=&client_id=&client_secret={my_client_secret}&grant_type=授权码
其他需要检查的事项:

  • 确保您使用的重定向uri与在google API中设置的相同
  • 你是如何找回身份验证码的?如果你是从页面标题中翻录的,我有个问题,没有在标题中返回完整的authcode,试着检查页面的主体。这种情况并非总是发生。我只是职业上的

  • 在您的代码中,您似乎使用“授权代码”作为授权类型。嗨,Emily,我的道歉我粘贴了错误的示例-使用grant_type=authorization_code使用准确的示例编辑粘贴实际的http请求和响应。将这些与Oauth中的等价物进行比较Playground@pinoyyidOAuth操场似乎通过在服务器上执行请求来掩盖实际请求side@Michael请求和响应显示在web页面上我最终意识到了这一点,所以我现在有一个PHP文件来检索访问令牌,并将其保存为.txt文件,以供客户端应用程序使用。我现在的问题是,既然我有了这个访问令牌,就尝试加载API。我尝试过使用XMLHttpRequest(),但遇到了相同的跨源问题(尽管谷歌文档指出这是CORS友好的方式),好吧,我不确定,因为我没有尝试,但谷歌可能会区分访问令牌,它们是通过授权流和令牌流检索的。尝试使用Fiddler并查找,如果Google发送了一个标题,如
    accesscontrolalloworigin::
    我总是收到这个异常。有什么线索吗?{错误:“无效的请求”错误描述:“缺少必需的参数:grant\U type”}这是GET请求还是POST请求?