2

我目前正在實施服務器端OAuth2流程以授權我的應用程序。Google 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 - 並且可以使用我自己的憑據成功獲取令牌。

我在這裏錯過了什麼嗎?

+1

它看起來像你的代碼,你使用「授權碼」作爲你的授權類型。 – Emily

+0

嗨,艾米麗,我的道歉我粘貼了錯誤的例子 - 用準確的例子編輯使用grant_type = authorization_code – locksem

+0

粘貼實際的http請求和響應。比較這些與Oauth Playground的等價物 – pinoyyid

回答

1

你不能這樣做,因爲有same origin policy。這是現代瀏覽器的安全概念,它可以防止JavaScript從另一個來源獲得響應,而不是您的網站。這是一個重要的概念,因爲它給你的能力,以保護你免受CSRF。所以不要使用代碼授權流程,而使用token authorization flow

+0

我最終意識到了這一點,所以我現在有一個PHP文件來檢索該訪問令牌,並將其保存到.txt文件以供客戶端應用程序使用。我現在的問題是試圖加載API現在我有這個訪問令牌。我嘗試過使用XMLHttpRequest(),但遇到了相同的跨源問題(儘管谷歌文檔聲明這是CORS友好的方式來做到這一點) – locksem

+0

好吧,我不確定,因爲我沒有嘗試,但Google可能會區分使用授權流和令牌流獲取的訪問令牌。嘗試使用Fiddler並查找,如果Google發送一個標頭,例如'Access-Control-Allow-Origin:*' –

1

嘗試並建立完整的網址。然後將其轉儲到網頁瀏覽器中。如果它的核心,你會得到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 

其他檢查事項:

  1. 請確保您使用的是建立在谷歌的API相同REDIRECT_URI。
  2. 你是如何獲得Authcode的?如果你從頁面的標題中刪除它,我有問題沒有在標題中返回完整的授權碼,請嘗試檢查頁面的正文。這不會一直髮生。我只是表面上。
+0

我總是會得到這個異常。任何線索爲什麼? 錯誤:「invalid_request」 error_description:「缺少必需的參數:grant_type」 } –

+0

這是GET還是POST請求? –

相關問題