2011-06-10 10 views
5

He implementado oauth y openid por separado (es decir, iniciar sesión con OpenId, autorización separada para Google Data API con OAuth) y me gustaría combinar ellos.buscando un buen ejemplo/plantilla para openid + oauth hybrid con python en Google App Engine

Actualmente tengo el siguiente en mi app.yaml

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

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

Luego, en main.py tengo: (retiradas por claridad importaciones)

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

también en main.py, de 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) 

Como para el protocolo híbrido, hay un PHP ejemplo here, y un ejemplo de java here pero no puedo encontrar nada para python.

Supongo que el inicio de la magia tendrá que ocurrir en mi OpenIDHandler, y que necesito usar algo que no sea users.create_login_url(). La documentación de Google here me dice que necesito 'Crear el mecanismo para realizar el descubrimiento y hacer solicitudes de autenticación'. y 'Agregar capacidad de OAuth a solicitudes de autenticación' (más documentos here), pero hasta donde sé, no cómo hacerlo. Al menos no con Python.

No es un ejemplo de una petición http prima un poco más abajo en 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/ 

pero no estoy seguro de cómo utilizar esto.

Así que, aparte de ayudar a que esto se convierta en un excelente ejemplo de una buena práctica, realmente necesito saber cómo 'Agregar capacidad de OAuth a las solicitudes de autenticación'.

+0

Tengo el mismo problema, me gustaría utilizar el protocolo híbrido en Python, pero no he encontrado ningún ejemplo. ¿Lo has logrado con eso? En caso afirmativo, publique un ejemplo de código. –

Respuesta

Cuestiones relacionadas