2017-02-23 12 views
1

Google signを私たちのiOSアプリケーションに統合しました。サーバーからGmail APIsオフラインにアクセスします。Gmail APIサーバーのアクセス「invalid_grant」iOS?

私たちは、サーバーへtoken_Idを提出しているが、サーバーは(サーバーがJavaである)、次の例外がスローされます。

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)") 
     } 
    } 

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

は、我々は次のコードiOSのコードを使用しているトークンIDを取得するには

オフラインアクセス用にuser.authentication.idTokenをサーバーに送信しています。

範囲は以下の通りです:

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

我々は&のServerID正しく、必要なクライアントIDを設定しています。 GIDSignInについては

私たちは、次のプロパティを作っています

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

答えて

2

invalid_grantは、通常、2つの原因があります。

  1. サーバーの時計がNTPと同期していません。 (解決方法:サーバーの時刻が間違っていないか確認してください)
  2. リフレッシュトークンの制限を超えました。 (解決策:何もできませんが、リフレッシュトークンを使用することはできません) アプリケーションは、複数のリフレッシュトークンを要求できます。たとえば、複数のマシンにアプリケーションをインストールする場合に便利です。この場合、インストールごとに1つずつ、2つのリフレッシュトークンが必要です。リフレッシュトークンの数が制限を超えると、古いトークンが無効になります。アプリケーションが無効化されたリフレッシュトークンを使用しようとすると、invalid_grantエラー応答が返されます。 OAuth 2.0クライアントの各固有のペアの制限で、50個のリフレッシュトークンです(この制限は変更される可能性があります)。アプリケーションが同じクライアント/アカウントのペアのリフレッシュトークンを要求し続けると、26番目のトークンが発行されると、以前に発行された最初のリフレッシュトークンは無効になります。 27番目に要求されたリフレッシュトークンは、以前に発行された2番目のトークンなどを無効にします。

このようにIDトークンを使用するのは難しいことがあります。使用しているサーバーのクロックは、おそらくクライアントで作成された時刻と一致する必要があります。私はIOSデベロッパーではないので、それ以上のことはできません。あなたがタイムゾーンがあなたを台無しにしている場合は、IDトークンを検証できません。

+0

Hey DalmTo、 ご回答ありがとうございます。 GmailをGoogle SignInのスコープとして使用できますか? –

+1

私が知っている限り、スコープの範囲を追加することができます。 – DaImTo

関連する問題