Api de usuarios de Google en App Engine

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.
Iniciar sesión GAE

Cuando damos click se nos lleva a una pantalla generada automaticamente por Google en donde se le pide al usuario que ingrese sus credenciales.

GAE user login

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:
GAE user

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="/">&#60;&#60; 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

2 thoughts on “Api de usuarios de Google en App Engine

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *