google - API de Gmail con OAuth y Python-AccessTokenRefreshError: invalid_grant
read gmail python (1)
Ajá, encontré el problema: tonterías de mi parte.
Estaba usando la "ID de cliente" y SignedJwtAssertionCredentials
eso a SignedJwtAssertionCredentials
Debería haber estado usando la "Dirección de correo electrónico", y pasar eso en su lugar.
Uno pensaría que el hecho de que la variable se llamara client_email
hubiera sido una pista ... jaja.
Como referencia, la página de documentos de API relevante:
Intento utilizar la API de Gmail con las bibliotecas cliente de Python. Sin embargo, estoy AccessTokenRefreshError: invalid_grant
un mensaje de error sobre AccessTokenRefreshError: invalid_grant
.
He instalado las bibliotecas del cliente de Google de la siguiente manera:
pip install google-api-python-client
He ido a la Consola de Desarrolladores de Google, he creado un nuevo Proyecto y luego he ido a API y autenticación , luego a Credenciales . Luego, hice clic en Crear nueva ID de cliente y en la cuenta de servicio seleccionada.
Al principio, cuando ejecuté lo siguiente, me quejé de que no había una biblioteca de cifrado, así que pip instalé pycrypto. Luego, se quejó de que el archivo de claves estaba en el formato incorrecto, así que pip instalé pyopenssl
Luego, en un shell Python corro:
from oauth2client.client import SignedJwtAssertionCredentials
client_email = ''<SANITISED>.apps.googleusercontent.com''
with open("foobar-d31647e3d00a.p12") as f:
private_key = f.read()
credentials = SignedJwtAssertionCredentials(client_email, private_key, ''https://www.googleapis.com/auth/gmail.readonly'')
from httplib2 import Http
http_auth = credentials.authorize(Http())
from apiclient.discovery import build
gmail_server = build(''gmail'', ''v1'', http=http_auth)
Es cuando ejecuto el último comando que obtengo la siguiente stacktrace:
AccessTokenRefreshError Traceback (most recent call last)
<ipython-input-8-7fd72f40edd2> in <module>()
----> 1 gmail_server = build(''gmail'', ''v1'', http=http_auth)
/Users/victorhooi/.virtualenvs/kenny/lib/python2.7/site-packages/oauth2client/util.pyc in positional_wrapper(*args, **kwargs)
133 else: # IGNORE
134 pass
--> 135 return wrapped(*args, **kwargs)
136 return positional_wrapper
137
/Users/victorhooi/.virtualenvs/kenny/lib/python2.7/site-packages/googleapiclient/discovery.pyc in build(serviceName, version, http, discoveryServiceUrl, developerKey, model, requestBuilder, credentials)
196 logger.info(''URL being requested: GET %s'' % requested_url)
197
--> 198 resp, content = http.request(requested_url)
199
200 if resp.status == 404:
/Users/victorhooi/.virtualenvs/kenny/lib/python2.7/site-packages/oauth2client/util.pyc in positional_wrapper(*args, **kwargs)
133 else: # IGNORE
134 pass
--> 135 return wrapped(*args, **kwargs)
136 return positional_wrapper
137
/Users/victorhooi/.virtualenvs/kenny/lib/python2.7/site-packages/oauth2client/client.pyc in new_request(uri, method, body, headers, redirections, connection_type)
528 if not self.access_token:
529 logger.info(''Attempting refresh to obtain initial access_token'')
--> 530 self._refresh(request_orig)
531
532 # Clone and modify the request headers to add the appropriate
/Users/victorhooi/.virtualenvs/kenny/lib/python2.7/site-packages/oauth2client/client.pyc in _refresh(self, http_request)
742 """
743 if not self.store:
--> 744 self._do_refresh_request(http_request)
745 else:
746 self.store.acquire_lock()
/Users/victorhooi/.virtualenvs/kenny/lib/python2.7/site-packages/oauth2client/client.pyc in _do_refresh_request(self, http_request)
805 except (TypeError, ValueError):
806 pass
--> 807 raise AccessTokenRefreshError(error_msg)
808
809 def _revoke(self, http_request):
AccessTokenRefreshError: invalid_grant
¿Alguna idea de lo que estoy haciendo mal?