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'.
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. –