2017-03-02 191 views
0

在一個web應用程序,我已經開發出一種client-server authentication該工作正常,流動:接入碼 - 無效憑證

  • 客戶端生成與grantOfflineAccess
  • 客戶端的接入碼將代碼傳遞給服務器
  • 服務器(相同client_id),檢查代碼的完整性,然後向Google請求access_tokenrefresh_token
  • 令牌被保存以供以後在離線模式下重用。

現在我想產生Chrome應用的接入碼,使得接入代碼傳遞給(相同)的服務器,以請求令牌後期再利用離線。

使用用於Web應用程序相同的client_id,我請求與chrome.identity.launchWebAuthFlow的代碼,這個網址參數(清洗可讀性):

https://accounts.google.com/o/oauth2/v2/auth? 
scope=profile email https://www.googleapis.com/auth/drive 
include_granted_scopes=true 
state=state_parameter_passthrough_value // I actually left this as it is 
redirect_uri=https://<app-id>.chromiumapp.org/chromelogin 
response_type=code 
access_type=offline 
client_id=[same_as_webapp] 

這實際工作,和我得到的接入碼,作爲傳遞給回調給chrome.identity.launchWebAuthFlow的回調的url的一部分。

問題是,當我然後發送訪問代碼到我的Web服務器,當它試圖生成令牌時,我得到一個Invalid Credentials 401錯誤。

我錯過了什麼嗎?

我也嘗試過使用不同的client_id,其中一個通過應用ID與Chrome應用綁定。在此過程中,我確實檢查了manifest.json中的密鑰是否與安裝的應用程序提供的密鑰相同(如所述here)。但是,成功生成訪問代碼後,服務器得到相同的錯誤消息。

編輯

服務器端,我用的接入碼喜歡生成令牌:

$aCode = $_POST['authcodefromclient']; 
$token = $googleClient->authenticate($aCode); 

回答

0

這裏是OAuth的流程的簡要介紹。

您第一次申請授權時,您將會短命訪問代碼。使用此訪問碼請求離線刷新令牌。保存刷新令牌。只要您的應用需要訪問受保護的資源,它就會使用刷新令牌請求訪問令牌。當您撥打Google API時,此訪問令牌將作爲http授權標頭提供。從您的描述中可以看出,當您使用訪問令牌時,您正在使用訪問代碼。

+0

這就是我正在做的事情,正如我在生成訪問和刷新標記所採用的步驟中概述的那樣。事實上,我的流程適用於我的Web應用程序和服務器端應用程序。只有當我嘗試使用'chrome.identity.launchWebAuthFlow'在Chrome應用程序中生成的代碼完成同樣的事情時,授權纔會失敗。 – ghego1

+0

授權您的應用程序後,您無需重新授權。如果您瀏覽鏈接的頁面,則不會對訪問代碼產生任何影響。 – pinoyyid

+0

據瞭解,我正嘗試首次授權應用程序:1.新用戶授予客戶端應用程序的訪問權限; 2.代碼傳遞給服務器; 3.服務器執行脫機身份驗證邏輯。正如我所提到的,我已經實現了oauth2邏輯,它正在我的web應用程序和服務器之間工作,所以我的問題在於在Chrome應用程序中實現相同的邏輯。 – ghego1