En App Engine se nos ofrece la opción de integrar en nuestro proyecto el login con usuarios de Google, con pocas lineas de código y en pocos minutos podemos autenticar usuarios.
La información que podemos obtener a travez de la API de usuarios es la siguiente:
- Email, el corroe electrónico de la cuenta de Google
- User id, número de usuario de Google, este numero nunca cambia, aunque el usuario cambie el correo de su cuenta.
- El dominio de la cuenta de correo del usuario. (Normalmente gmail.com)
- Saber si el usuario es administrador de la aplicación GAE.
Autenticar usuarios, ejemplo
Para usar la api de usuarios de Google tan solo basta con la siguiente linea de código:
from google.appengine.api import users
Una vez importada, podemos saber fácilmente si existe un usuario autenticado y obtener su información.
#!/usr/bin/env python # -*- coding: utf-8 -*- import webapp2 from google.appengine.api import users class MainPage(webapp2.RequestHandler): def get(self): user = users.get_current_user() if user: nombre_usuario = user.nickname() logout_url = users.create_logout_url('/') saludo = 'Hola, {}! (<a href="{}">Cerrar sesión</a>)'.format( nombre_usuario, logout_url) else: login_url = users.create_login_url('/') saludo = '<a href="{}">Iniciar sesión</a>'.format(login_url) self.response.write( '<html><body>{}</body></html>'.format(saludo)) app = webapp2.WSGIApplication([ ('/', MainPage) ], debug=True)
Si ejecutamos esta aplicación, al principio veremos un enlace para iniciar sesión ya que no estamos autenticados.
Cuando damos click se nos lleva a una pantalla generada automaticamente por Google en donde se le pide al usuario que ingrese sus credenciales.
Nota: La pantalla mostrada en este tutorial es la pantalla que aparece en el ambiente de desarrollo local, la pantalla que aparece en producción es muy diferente.
En el ambiente de desarrollo local cualquier usuario ingresado es correcto, ademas, se nos da la opción de marcarlo como administrador.
Una vez autenticado lo que veremos será lo siguiente:
Un ejemplo más completo
El siguiente ejemplo define tres zonas de una aplicación: una pública, una zona privada y una zona de administración.
Archivo principal:
#!/usr/bin/env python # -*- coding: utf-8 -*- import webapp2 from google.appengine.api import users class AdminZone(webapp2.RequestHandler): def get(self): self.response.write("<html><body>") self.response.write("<h1>Zona de administrador</h1>") self.response.write("<p>Administrador: %s</p>" % users.is_current_user_admin() ) self.response.write("<a href='/profile'>Perfil de usuario</a>") self.response.write("<p><a href='%s'>Cerrar sesión</a> </p>" % users.create_logout_url('/')); self.response.write('</body></html>') class UserZone(webapp2.RequestHandler): def get(self): user = users.get_current_user() self.response.write("<html><body>") self.response.write("<h1>Perfil de usuario</h1>") self.response.write('<p><a href="/"><< Zona pública</a></p>'); self.response.write("<p>Solo se puede estar en esta sección si se ha iniciado sesión</p>") self.response.write("<p>Email: %s</p>" % user.email()) self.response.write("<p>ID de usuario: %s</p>" % user.user_id()) self.response.write("<p>Nickname: %s</p>" % user.nickname()) self.response.write("<p>Dominio: %s</p>" % user.auth_domain()) self.response.write("<p><a href='%s'>Cerrar sesión</a> </p>" % users.create_logout_url('/')); self.response.write('</body></html>') class PublicZone(webapp2.RequestHandler): def get(self): self.response.write("<html><body>") self.response.write("<h1>Zona pública</h1>") self.response.write("<p>Cualquier persona puede estar en esta sección.</p>") self.response.write("<ul>" "<li><a href='/profile'>Perfil de usuario</a></li>" "<li><a href='/admin'>Zona de administrador</a></li>" "</ul>") self.response.write('</body></html>') app = webapp2.WSGIApplication([ ('/', PublicZone), ('/profile', UserZone), ('/admin', AdminZone) ], debug=True)
Archivo de configuración:
application: prueba-app version: 1 runtime: python27 api_version: 1 threadsafe: yes handlers: - url: /favicon\.ico static_files: favicon.ico upload: favicon\.ico - url: /profile script: main.app login: required - url: /admin script: main.app login: admin - url: .* script: main.app libraries: - name: webapp2 version: "2.5.2"
Cuando ejecutemos el proyecto, podremos navegar entre las diferentes zonas (publica, privada y administración). En este ejemplo los permisos de cada zona de la página se definen en el archivo de configuración mediante al tributo login.
El atributo login es opcional, y puede establecer tres valores:
- required cuando se require que el usuario inicie sesión
- admin cuando se require que el usuario inicie sesión y ademas este registrado como administrador de la aplicación
- optional cuando no se require que el usuario inicie sesión, ésta es la opción por defecto
El código de la aplicación se puede ver y descargar en: https://github.com/notasdesoftware/gae-users
Muy buen aporte, me gustan tus reseñas y tutoriales
Excelente explicación. Gracias 🙂