2012-04-08 7 views
5

Mam aplikację hostowaną w wyszukiwarce Google (http://spititan.appspot.com). Mam również narzędzie wiersza poleceń, aby uzyskać dostęp do tej aplikacji za pośrednictwem ClientLogin. Fragment kodu jest następujący:Jak używać OAuth2 w narzędziu wiersza poleceń, aby uzyskać dostęp do aplikacji hostowanej w Google Appengine?

138 # get an AuthToken from Google accounts 
139 auth_uri = 'https://www.google.com/accounts/ClientLogin' 
140 authreq_data = urllib.parse.urlencode({ "Email": email_address, 
141          "Passwd": password, 
142          "service": "ah", 
143          "source": appname, 
144          "accountType": "HOSTED_OR_GOOGLE" }) 
145 request = urllib.request.Request(auth_uri, data=authreq_data) 
146 response = opener.open(request) 
147 response_body = str(response.read(), 'utf-8') 
148 response_dict = dict(x.split("=") for x in response_body.split("\n") if x) 
149 return response_dict["Auth"] 

... 
... 

112 # Send the auth token to the AppEngine to login 
113 continue_location = "http://localhost/" 
114 args = {"continue": continue_location, "auth": auth_token} 
115 host = "spititan.appspot.com" % appname 
116 url = "https://spititan/_ah/login?%s" % urllib.parse.urlencode(args) 
... 
... 

To narzędzie działa dobrze dla mnie na dłuższą chwilę z niewielkim drażnić że muszę podać hasło co kilka dni. Zauważyłem, że OAuth2 jest obecnie zalecanym sposobem uwierzytelniania, więc udało mi się nauczyć go używać i napisać poniższy fragment kodu, postępując zgodnie z dokumentem (http://code.google.com/p/google-api-python-client/wiki/OAuth2):

59 storage = oauth2client.file.Storage(
60  os.path.join(FLAGS.data_dir, 'confidential.dat')) 
61 
62 credentials = storage.get() 
63 
64 if credentials is None or credentials.invalid == True: 
65  flow = oauth2client.client.OAuth2WebServerFlow(
66   client_id='<xxxxx>', 
67   client_secret='<xxxxx>', 
68   scope='<xxxxx>', 
69   user_agent='<xxxx>') 
70 
71  credentials = oauth2client.tools.run(flow, storage) 
72 
73 http = httplib2.Http(cache=".cache") 
74 http = credentials.authorize(http) 

Moje zrozumienie jest 'client_id' i 'client_secret' zostały nabyte kiedy zarejestrować aplikację user_agent to darmowy format string, problem: co należy umieścić w „zakresie "? Próbowałem http://spititan.appspot.com/spititan, ale nie miałem szczęścia, czy ktoś ma jakiś pomysł?

Dzięki

Odpowiedz

0

Spróbuj scope='https://www.googleapis.com/auth/appengine.admin'. Szukałem zakresie interfejsu App Engine zbyt raz i okazało się, że tutaj:

http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/appcfg.py#143

Jeśli starasz się zrobić coś innego niż zalogowaniu się jako administrator, to nie będzie działać. AFAIK GAE obsługuje ClientLogin, OAuth 1.0 i OpenID ATM. Tak więc nie ma OAuth 2.0. Zastanawiam się, kiedy będą.

+0

Nie sądzę, że to jest poprawne. Ten zakres to zakres OAuth, który autoryzuje aplikację do administrowania aplikacjami App Engine użytkownika, na przykład przekazując token odświeżania do appcfg.py zgodnie z opisem w https://developers.google.com/appengine/docs/python/tools/ uploadinganapp # oauth –

+0

Nie sądzę, żeby to było w porządku, chociaż nie wypróbowałem jeszcze sugestii. Sądzę, że przynajmniej adres URL zakresu będzie jakoś wspomnieć o "spititanie". – spititan

+0

@JasonHall Dobrze, ten zakres dotyczy autoryzacji administratora aplikacji. – alex

Powiązane problemy