2011-06-10 16 views
5

Ho implementato oauth e openid separatamente (ovvero, accedi con OpenId, autorizzazione separata all'API dati di Google con OAuth) e vorrei unire loro.cercando un buon esempio/template per openid + oauth hybrid con python in Google App Engine

Attualmente ho il seguente nel mio app.yaml

- url: /_ah/login_required 
    script: main.py 

- url: .* 
    script: main.py 
    login: required 

Poi, nel main.py ho: (importazioni rimosse per chiarezza)

def getClient(): 
    client = gdata.calendar.service.CalendarService() 
    consumer_key = 'my-app.appspot.com' 
    consumer_secret = 'consumersecret' 
    client.SetOAuthInputParameters(
     gdata.auth.OAuthSignatureMethod.HMAC_SHA1, 
     consumer_key=consumer_key, 
     consumer_secret=consumer_secret) 
    gdata.alt.appengine.run_on_appengine(client) 
    return client 

class OAuthOne(webapp.RequestHandler): 
    def get(self): 
     client = getClient() 
     request_token = client.FetchOAuthRequestToken(oauth_callback='http://my-app.appspot.com/oauth2') 
     client.SetOAuthToken(request_token) 
     auth_url = client.GenerateOAuthAuthorizationURL() 
     self.redirect(auth_url) 

class OAuthTwo(webapp.RequestHandler): 
    def get(self): 
     client = getClient() 
     token_from_url = gdata.auth.OAuthTokenFromUrl(self.request.uri) 
     if not token_from_url: 
      self.redirect('/oauth') 
     else: 
      client.SetOAuthToken(token_from_url) 
      oauth_verifier = self.request.get('oauth_verifier', default_value='') 
      client.UpgradeToOAuthAccessToken(oauth_verifier=oauth_verifier) 
      self.redirect('/') 

class MainPage(webapp.RequestHandler): 

    def get(self): 
     self.user = users.get_current_user() 
     self.template_values = {} 
     if self.user: 
      # do calendar api stuff here 
      self.template_file = 'templates/index.html' 
     else: 
      self.template_file = 'templates/denied.html' 

     path = os.path.join(os.path.dirname(__file__), self.template_file) 
     self.response.out.write(template.render(path, self.template_values)) 

application = webapp.WSGIApplication(
           [('/oauth', OAuthOne), 
            ('/oauth2', OAuthTwo), 
            ('/_ah/login_required', OpenIDHandler), 
            ('/', MainPage)], 
           debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

anche in main.py, da http://code.google.com/googleapps/marketplace/tutorial_python_gae.html

class OpenIDHandler(webapp.RequestHandler): 
    def get(self): 
     """Begins the OpenID flow and begins Google Apps discovery for the supplied domain.""" 
     login_url = users.create_login_url(dest_url='http://my-app.appspot.com/', 
              _auth_domain=None, 
              federated_identity='gmail.com') 
     self.redirect(login_url) 

quanto riguarda il protocollo ibrido, c'è un PHP esempio here e un esempio java here ma non riesco a trovare nulla per python.

Suppongo che l'inizio della magia dovrà accadere nel mio OpenIDHandler e che ho bisogno di usare qualcosa di diverso da users.create_login_url(). La documentazione di Google here mi dice che ho bisogno di "Creare il meccanismo per eseguire l'individuazione e fare richieste di autenticazione". e "Aggiungi funzionalità OAuth alle richieste di autenticazione" (più documenti here), ma per quanto posso dire, non come farlo. Almeno non con Python.

V'è un esempio di una richiesta HTTP prime un po 'più basso sul this page

https://www.google.com/accounts/o8/id 
?openid.ns=http://specs.openid.net/auth/2.0 
&openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select 
&openid.identity=http://specs.openid.net/auth/2.0/identifier_select 
&openid.return_to=http://www.example.com/checkauth 
&openid.realm=http://www.example.com 
&openid.assoc_handle=ABSmpf6DNMw 
&openid.mode=checkid_setup 
&openid.ns.oauth=http://specs.openid.net/extensions/oauth/1.0 
&openid.oauth.consumer=www.example.com 
&openid.oauth.scope=http://docs.google.com/feeds/+http://spreadsheets.google.com/feeds/ 

Ma io non sono sicuro di come utilizzare questo.

Quindi, oltre a contribuire a far sì che diventi un esempio lampante di best practice, ho davvero bisogno di sapere come aggiungere funzionalità OAuth alle richieste di autenticazione.

+0

Ho lo stesso problema, mi piacerebbe utilizzare il protocollo ibrido in Python ma non ho trovato alcun esempio. Ci sei riuscito? Se sì, per favore pubblica un esempio di codice. –

risposta