serviceaccountcredentials secret google example engine auth app python google-app-engine oauth google-oauth

python - secret - oauth2client



InformaciĆ³n del usuario usando OAuth con Google App Engine (1)

Al utilizar OAuth 2.0 y Python, deseo tener la identificación de usuario o el correo electrónico para almacenar / recuperar el token de acceso OAuth, ya que quiero modificar un calendario incluso después de que el usuario se haya ido.

Hay tanta documentación y la mitad está obsoleta (OAuth 1.0) que no he podido resolver esto.

Tengo el siguiente código:

import webapp2 import os from apiclient.discovery import build from oauth2client.appengine import OAuth2DecoratorFromClientSecrets from google.appengine.api import oauth user_scope = ''https://www.googleapis.com/auth/userinfo.profile'' decorator = OAuth2DecoratorFromClientSecrets( os.path.join(os.path.dirname(__file__), ''client_secrets.json''), scope=(''https://www.googleapis.com/auth/calendar'', user_scope) ) service = build(''calendar'', ''v3'') class MainHandler(webapp2.RequestHandler): @decorator.oauth_required def get(self): self.response.write(''Hello world!'') user = oauth.get_current_user(user_scope) if user: self.response.write(''%s/n'' % user) self.response.write(''- email = %s/n'' % user.email()) self.response.write(''- nickname = %s/n'' % user.nickname()) self.response.write(''- user_id = %s/n'' % user.user_id()) else: self.response.write(''No user found...'') app = webapp2.WSGIApplication([ (''/'', MainHandler), (decorator.callback_path, decorator.callback_handler()) ], debug=True)

Esto funciona localmente en el entorno de prueba, sin embargo, cuando lo despliego y lo ejecuto en línea, aparece el siguiente error:

Traceback (most recent call last): File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__ rv = self.handle_exception(request, response, e) File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__ rv = self.router.dispatch(request, response) File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher return route.handler_adapter(request, response) File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__ return handler.dispatch() File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch return self.handle_exception(e, self.app.debug) File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch return method(*args, **kwargs) File "/base/data/home/apps/s~myapp/oauth2client/appengine.py", line 714, in check_oauth resp = method(request_handler, *args, **kwargs) File "/base/data/home/apps/s~myapp/main.py", line 29, in get user = oauth.get_current_user(''https://www.googleapis.com/auth/userinfo.profile'') File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/oauth/oauth_api.py", line 100, in get_current_user _maybe_call_get_oauth_user(_scope) File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/oauth/oauth_api.py", line 231, in _maybe_call_get_oauth_user _maybe_raise_exception() File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/oauth/oauth_api.py", line 246, in _maybe_raise_exception raise NotAllowedError(error_detail) NotAllowedError

¿Qué me estoy perdiendo que causa este error?


Acabo de conseguir algo similar trabajando en mi lado. Una vez que lleva al usuario a OAuth, necesita almacenar la identificación de usuario actual. Puede hacerlo a través del almacén de datos o como un parámetro si usa las colas de tareas

from google.appengine.api import users ClientID = users.get_current_user().user_id()

Luego, con el código que sea, necesitarás ejecutar los tokens de OAuth.

from oauth2client.appengine import CredentialsModel from oauth2client.appengine import StorageByKeyName credentials = StorageByKeyName(CredentialsModel, ClientID, ''credentials'').get() cal = build(''calendar'', ''v3'',http = credentials.authorize(httplib2.Http()))

Luego usa la llamada para hacer tus llamadas API.