2017-02-23 86 views
1

我們在我們的iOS應用程序中集成了Google sign,我們希望從服務器離線訪問Gmail APIsGmail API服務器訪問「invalid_grant」iOS?

我們提交token_Id到服務器,但是服務器拋出以下異常(服務器是在Java中):

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request 
{ 
    "error" : "invalid_grant", 
    "error_description" : "Bad Request" 
} 

爲了讓我們用下面的代碼的iOS代碼的令牌標識:

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { 
     if (error == nil) { 
      let idToken = user.authentication.idToken 
      let fullName = user.profile.name 
      print("Connected for user: \(fullName)") 
      print("Id Token: \(idToken)") 
      setAppUserContext(userId: idToken!) 
     } else { 
      print("\(error.localizedDescription)") 
     } 
    } 

我們正在向服務器發送user.authentication.idToken以進行離線訪問。

範圍是如下:

gid?.scopes.append("https://www.googleapis.com/auth/gmail.readonly") 

我們& serverIds正確設置所需的clientID的。

對於GIDSignIn我們做了以下屬性:

GIDSignIn.sharedInstance().uiDelegate = self 
GIDSignIn.sharedInstance().signInSilently() 

回答

2

invalid_grant通常有兩個原因。

  1. 您的服務器時鐘與NTP不同步。 (解決方案:檢查服務器時間是否錯誤修復了它。)
  2. 已超過刷新令牌限制。 (解決方案:你無能爲力,他們無法使用更多刷新令牌) 應用程序可以請求多個刷新令牌。例如,這在用戶想要在多臺機器上安裝應用程序的情況下非常有用。在這種情況下,需要兩個刷新標記,每個安裝一個。當刷新令牌的數量超過限制時,舊令牌變爲無效。如果應用程序嘗試使用無效刷新標記,則返回invalid_grant錯誤響應。每個獨特的OAuth 2.0客戶端對的限制爲50個刷新令牌(請注意,此限制可能會發生變化)。如果應用程序繼續爲相同的客戶端/帳戶對請求刷新令牌,則一旦發出第26個令牌,以前發出的第1個刷新令牌就會失效。第二十七個請求刷新令牌將使第二個先前發出的令牌無效,等等。

以這種方式使用ID令牌可能會非常棘手。您使用的服務器上的時鐘可能必須與它在客戶端上創建的時間相匹配。我不是一個IOS開發人員,所以幫不了那麼多。如果時區讓你感覺混亂,你不能驗證id令牌。

+0

Hey DalmTo, 感謝您的回覆。我們可以使用Gmail作爲Google SignIn中的範圍嗎? –

+1

據我所知,你可以添加任何你希望的範圍,只需在它們之間增加空間。 – DaImTo