OAuth2Credential 개체가 access_token을 새로 고치려고하면 때때로 invalid_grant 오류가 발생하고 새로 고칠 수 없게됩니다. 내가 사용한 코드는 Google의 Python API 및 Mirror API 예제를 기반으로합니다.토큰을 새로 고치려고 할 때 invalid_grant 가져 오기
배경 :
- 인증 OAuth2Credential 객체
oauth2client
모듈을 사용. - OAuth2Credential 개체 절인 저장 및
- 이 코드는 3 개 개의 다른 서버에서 실행 미러 API를 호출 할
apiclient
모듈을 사용하여 구글의 자신의 예제 코드 - 같은 데이터베이스에 base64'd 는 모두 같은 문제 때 전시 내가 설정되어 있습니다
- 내가 그 access_type을 확인할 수 있습니다 요청
- 스코프를 보내려고 "오프라인"나는 단지의 경우 에 "힘"으로 approval_prompt을 요청
- 에 서비스를 호출
from apiclient.discovery import build http = credential.authorize(http=httplib2.Http()) service = build("mirror", "v1", http=http) payload = <JSON_PAYLOAD_HERE> service.timeline().insert(body=payload).execute()
는 access_token은이 갱신 될 필요가 의미 (401)를 발행하는, 가능성이있는 경우 : 여기
"https://www.googleapis.com/auth/glass.timeline"
및
"https://www.googleapis.com/auth/userinfo.profile"
미러 API를 호출하는 데 사용되는 코드입니다 . 그런 다음 오류가 invalid_grant 인 AccessTokenRefreshError를 제외한 refresh 메서드를 호출합니다. 이 시점에서 신임장은 access_token이 만료되고 refresh_token이 동일한 오류 만 발생하기 때문에 bunk만큼이나 우수합니다.
이 문제는 NTP 문제로 인해 발생할 수 있다고 말하는 페이지를 보았지만 서버가 동기화되어 있음을 확인 (심지어 NTP 서버로 전환)했습니다. 다른 문서화 된 가능성은 재활용하기 전에 25 개의 새로 고치기 토큰 만 존재할 수 있지만 Credential 개체에 store() 메서드를 구현 했으므로 새로 고쳐지면 새 자격 증명이 저장됩니다 (이 방법이 작동하는지 확인할 수 있습니다). 데이터베이스를 새로 고칠 때 새 정보가 표시됨).
필요에 따라이 문제를 해결하기 위해 사용자의 자격 증명을 얻을 수 없기 때문에 "잠시 기다리십시오"이외의 다른 문제를 재현 할 수있는 다른 조건을 설명 할 수 없습니다. 나는 한 번의 호출을 인증하고 보낸 후 곧 100 번 호출 한 후 일주일의 가치가있는 문제가 발생하는 것을 보았습니다.
지금 해결할 문제를 얻는 유일한 방법은 사용자에게 재 인증을 요청하는 것입니다.하지만 사용자 상호 작용없이 API를 오프라인으로 사용할 것으로 예상되므로 해결책은 아닙니다. 또한 사용자에게 다시 인증해야한다고 알릴 방법이 없습니다.
사용자가 액세스 권한을 취소하지 않은 경우에도이 오류가 발생했는지 확인할 수 있습니까? 일반적으로이 오류는 사용자가 MyGlass에서 Glassware를 끄거나 계정 페이지로 이동하여 토큰을 취소하여 액세스 권한을 취소 할 때 발생합니다. – Alain
사용자가 토글을 해제했다는 말을 다시 들었습니다. 영구적으로 액세스를 취소합니까? 아니면 꺼져있는 동안 일시적으로 액세스가 취소됩니까? –
이렇게하면 액세스가 영구적으로 취소됩니다. 사용자는 새로운 OAuth 2.0 자격증 명 집합을 제공하기 위해 인증 과정을 다시 거쳐야합니다. – Alain