2017-01-10 131 views
1

您好我有根據谷歌的OAuth 2明確的流程工作:谷歌的OAuth 2的iOS隱流,刷新令牌手動

https://developers.google.com/identity/protocols/OAuth2WebServer

我也有隱含的流動iOS上正與GIDSignIn,具體我得到GIDSignInDelegate::sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!)回調,並有權訪問user.authentication.accessTokenuser.authentication.refreshToken

我試圖將refreshToken傳回給我們的私人應用程序服務器,以便它可以代表用戶發出請求(主要是因爲使用SDK登錄比使前端開發人員處理raw URL請求)。

然而,當我嘗試使用刷新令牌來獲得在後端新的訪問令牌:

curl --request POST \ 
    --url https://www.googleapis.com/oauth2/v4/token \ 
    --header 'cache-control: no-cache' \ 
    --header 'content-type: application/x-www-form-urlencoded' \ 
    --data 'client_id={client_id}&client_secret={client_secret}&refresh_token={refresh_token}&grant_type=refresh_token' 

它返回:

{ "error": "invalid_grant", "error_description": "Bad Request" }

我認爲這個問題是我的服務器有一個客戶端ID和密碼,但iOS只有一個客戶端ID。沒有與iOS客戶端ID相對應的祕密(有時稱爲密鑰),我無法刷新後端的令牌。我希望Google能夠檢測到服務器客戶端ID和iOS客戶端ID都註冊到同一個應用程序,並讓服務器使用其憑據刷新令牌,但這不起作用。

我看無論是 「API密鑰」 和 「OAuth 2.0用戶端ID爲」 部分在:

https://console.developers.google.com/apis/credentials

但很茫然。

有誰知道刷新通過iOS SDK中獲得令牌的curl命令?

或者,這是根本不可能的?

謝謝!

回答

0

對於任何人讀這篇文章,我得到它的工作:

一時心血來潮想拜訪刷新令牌端點,而無需經過client_secret(如使用隱式流當移動沒有之一)。這裏是捲曲:

curl --request POST \ 
    --url https://www.googleapis.com/oauth2/v4/token \ 
    --header 'content-type: application/x-www-form-urlencoded' \ 
    --data 'client_id={client_id}&refresh_token={refresh_token}&grant_type=refresh_token' 

這似乎是無證。我發現的最接近的例子是在https://developers.google.com/identity/protocols/OAuth2InstalledApp#refresh但它顯示client_secret=your_client_secret&,從來沒有提到與隱流,前端Web和移動應用程序通常不使用客戶端機密。

請不要給予好評我的答案,因爲我沒有做任何事情。 OAuth通常沒有很好地記錄,或者包含與平臺SDK相關的代碼片段,而沒有基礎的URL請求或捲曲示例。軟件開發工具包通常是不透明/閉源的,因此需要下載到tcpdump或者數據包嗅探來查看發生了什麼。我沒有做盡職調查,我很幸運。

我已將反饋發送給Google,但如果此問題影響到您,您可以點擊Gmail中的設備和「發送反饋」,以便更快速地更新文檔。

0

請參考以下鏈接: https://developers.google.com/identity/sign-in/ios/offline-access

從引用,你必須做以下2steps讓你的服務器能夠刷新您的訪問令牌

  1. 確保您的服務器和iOS應用使用1同一項目的資格證書,1個瀏覽器密鑰的iOS鍵
  2. 加入這一行:[GIDSignIn sharedInstance].serverClientID = your_server_client_id