2014-09-23 10 views
6

Podczas korzystania z OAuth 2.0 i Pythona chcę mieć identyfikator użytkownika lub adres e-mail do przechowywania/pobierania tokenu dostępu OAuth, ponieważ chcę zmodyfikować kalendarz nawet po jego odejściu.Informacje o użytkowniku za pomocą protokołu OAuth z Google App Engine

Jest tyle dokumentacji, a połowa z nich jest przestarzała (OAuth 1.0), której nie byłem w stanie wymyślić.

Mam następujący kod:

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) 

to działa lokalnie w środowisku testowym, jednak gdy wdrożyć go i uruchomić go w Internecie pojawia się następujący błąd:

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 

Co mam brakujące, które powoduje ten błąd?

+0

Prawdopodobnie warto włączyć śledzenie http w bibliotekach google, aby można było zobaczyć, co się dzieje przez przewód. Biblioteki OAuth lubią zaciemniać podstawowy błąd. Domyślam się, że Twój URL wywołania zwrotnego jest niepoprawny. – pinoyyid

+2

+1 dla 'nie ma wiele dokumentacji, ale [to wszystko bzdura]'. Rzeczywiście jest to odwrotność w przypadku zwykłej skargi braku dokumentacji. Tutaj znajdziesz stertę potrzebnych informacji. –

Odpowiedz

4

Właśnie coś podobnego działało na moim końcu. Po wprowadzeniu użytkownika do OAuth należy zapisać bieżący identyfikator użytkownika. Można to zrobić za pośrednictwem magazynu danych lub jako parametr jeśli używasz kolejkami zadań

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

następnie co kiedykolwiek kod później potrzebować OAuth tokeny uruchomić.

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())) 

Następnie użyj komendy cal, aby wykonywać połączenia API.

+0

Dzięki, używam tego teraz, niestety istnieje błąd, że jeśli jesteś zalogowany z 5 lub więcej użytkownikami otrzymasz 400 błędów. Podobno ten błąd nie został naprawiony: https://code.google.com/p/googleappengine/issues/detail?id=9045 i https://twitter.com/googlecloud/status/467411184430239745 –

+0

Nie wiedziałem o tym Dziękuję Ci. Będę musiał to mieć na oku. – Ryan

Powiązane problemy