在一個web應用程序,我已經開發出一種client-server authentication該工作正常,流動:接入碼 - 無效憑證
- 客戶端生成與
grantOfflineAccess
- 客戶端的接入碼將代碼傳遞給服務器
- 服務器(相同
client_id
),檢查代碼的完整性,然後向Google請求access_token
和refresh_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);
這就是我正在做的事情,正如我在生成訪問和刷新標記所採用的步驟中概述的那樣。事實上,我的流程適用於我的Web應用程序和服務器端應用程序。只有當我嘗試使用'chrome.identity.launchWebAuthFlow'在Chrome應用程序中生成的代碼完成同樣的事情時,授權纔會失敗。 – ghego1
授權您的應用程序後,您無需重新授權。如果您瀏覽鏈接的頁面,則不會對訪問代碼產生任何影響。 – pinoyyid
據瞭解,我正嘗試首次授權應用程序:1.新用戶授予客戶端應用程序的訪問權限; 2.代碼傳遞給服務器; 3.服務器執行脫機身份驗證邏輯。正如我所提到的,我已經實現了oauth2邏輯,它正在我的web應用程序和服務器之間工作,所以我的問題在於在Chrome應用程序中實現相同的邏輯。 – ghego1