2017-02-23 5 views
1

우리는 iOS 응용 프로그램에 Google sign을 통합하여 서버에서 Gmail APIs 오프라인으로 액세스하려고합니다.Gmail API 서버 액세스 "invalid_grant"iOS?

우리는 서버에 token_Id을 제출하지만, 서버 (서버는 자바에) 다음과 같은 예외를 던지고있다 :

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

우리가 다음 코드 아이폰 OS 코드를 사용하는 토큰 ID를 얻으려면

오프라인 액세스를 위해 서버에 user.authentication.idToken을 보냅니다.

범위는 다음과 같습니다 :

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

우리는 & serverIds 제대로 필요한 클라이언트 ID를 설정했습니다.

은 GIDSignIn 위해 우리는 속성을 다음 만들었 :

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

답변

2

invalid_grant은 일반적으로 두 가지 원인이있다.

  1. 서버의 시계가 NTP와 동기화되지 않았습니다. (해결 방법 : 서버 시간을 검사하여 올바르지 않은 경우 서버 시간을 확인하십시오.)
  2. 새로 고침 토큰 제한을 초과했습니다. (해결책 : 할 수있는 일이 없으면 새로 고침 토큰을 사용할 수 없습니다.) 응용 프로그램에서 여러 개의 새로 고침 토큰을 요청할 수 있습니다. 예를 들어 사용자가 여러 컴퓨터에 응용 프로그램을 설치하려는 경우에 유용합니다. 이 경우 각 설치마다 하나씩 두 개의 새로 고치기 토큰이 필요합니다. 새로 고침 토큰 수가 제한을 초과하면 이전 토큰이 유효하지 않게됩니다. 응용 프로그램이 유효하지 않은 새로 고침 토큰을 사용하려고하면 invalid_grant 오류 응답이 반환됩니다. OAuth 2.0 클라이언트의 각 고유 한 쌍에 대한 제한이며 50 개의 새로 고침 토큰입니다 (이 제한은 변경 될 수 있음에 유의하십시오). 응용 프로그램이 동일한 클라이언트/계정 쌍에 대한 새로 고치기 토큰을 계속 요청하면 26 번째 토큰이 발행되면 이전에 발행 된 첫 번째 새로 고침 토큰이 유효하지 않게됩니다. 27 번째 요청 된 새로 고침 토큰은 이전에 발행 된 두 번째 토큰을 무효화합니다.

이렇게하면 ID 토큰을 사용하는 것이 까다로울 수 있습니다. 사용중인 서버의 시계는 클라이언트에서 작성된 시간과 일치해야합니다. 저는 IOS 개발자가 아니기 때문에 그다지 도움이되지 않습니다. 시간대가 너를 망치고 있다면 ID 토큰의 유효성을 검사 할 수 없다.

+0

안녕하세요 DalmTo, 답변 해 주셔서 감사합니다. Gmail을 Google SignIn의 범위로 사용할 수 있습니까? –

+1

내가 아는 한 범위를 추가하여 원하는 범위를 추가 할 수 있습니다. – DaImTo