簡體   English   中英

Chrome應用中的Google Oauth2訪問代碼-無效的憑據

[英]Access code for Google Oauth2 in Chrome app - invalid credentials

在一個Web應用程序中,我開發了一種客戶端服務器身份驗證 ,該身份驗證正常工作,流程如下:

  • 客戶端使用grantOfflineAccess生成訪問代碼
  • 客戶端將代碼傳遞給服務器
  • 服務器(相同的client_id ),檢查代碼的完整性,然后向Google要求使用帶有refresh_tokenaccess_token
  • 令牌已保存,供以后在脫機模式下重用。

現在,我想在Chrome應用中生成訪問代碼,以便將訪問代碼傳遞到(同一台)服務器,以請求令牌以供離線離線使用。

使用用於Web應用程序的相同client_id ,我使用chrome.identity.launchWebAuthFlow請求代碼,並帶有以下url參數(出於可讀性的考慮):

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等於所安裝應用提供的密鑰(如描述在這里 )。 但是,成功生成訪問代碼后,服務器會收到相同的錯誤消息。

編輯

在服務器端,我使用訪問代碼來生成令牌:

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

這是OAuth流程的簡短摘要。

首次請求授權時,您將獲得短暫的訪問代碼 使用此訪問代碼來請求脫機刷新令牌 保存刷新令牌。 每當您的應用程序需要訪問受保護的資源時,它都會使用刷新令牌來請求訪問令牌 調用Google API時,此訪問令牌將作為http授權標頭提供。 從您的描述中可以看出,您應該使用訪問令牌時正在使用訪問代碼。

可以通過chrome.identity.launchWebAuthFlow() ,但是這將需要Chrome用戶輸入其登錄憑據。 查看此答案: 使用Chrome Identity API獲取id_token

如果您不需要長時間訪問用戶的Google帳戶,則可以使用chrome.identity.getAuthTokenaccess_token臨時訪問。 我之所以這樣,是因為Chrome用戶無需輸入其憑據(如果他們已登錄Chrome瀏覽器或ChromeBook)。 我將access_token傳遞到服務器,然后通過調用以下命令進行驗證: https : //www.googleapis.com/oauth2/v3/tokeninfo? access_token = {0}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM