Utilización de OAuth 1.0 en Google Apps con python bottle


Siguiendo con el uso de OAuth como en la entrada anterior Utilización paso a paso de OAuth 1.0 en twitter con python bottle seguimos con la utilización de este mecanismo de autorización, pero esta vez utilizando Google Apps como proveedor de servicios. Toda la discusión sobre las características principales de OAuth 1.0 está en la entrada anterior, por lo que recomendamos su lectura previa a cualquier lector interesado. Google ya no recomienda utilizar la versión 1.0 de OAuth, que dan por obsoleta (“deprecated”) y recomiendan realizar nuevas aplicaciones utilizando OAuth 2.0, pero en nuestro caso, que se trata principalmente de un ejercicio académico para comprender el funcionamiento de OAuth y puesto que ya tenemos una mini aplicación desarrollada, vamos a reutilizar la mayor parte de este código para interactuar ahora con una de las múltiples APIs de las que dispone Google, en concreto Google Apps Email Settings API Authentication.

Dar de alta la aplicación en Google

Damos de alta la aplicación a través de Google API console y activamos el “Google Apps Reseller API” y damos de alta la autorización OAuth, quedándonos finalmente un panel similar al siguiente:

alta en google app

Google denomina “Client ID” al “consumer key” de OAuth y “client secret” al “comsumer secret”. La descripción detallada de la implementación de OAuth 1.0 que hace Google está disponible en OAuth 1.0 API Reference, donde podemos extraer algunos detalles más:

  • Para obtener el token de solicitud se utiliza la URL https://www.google.com/accounts/OAuthGetRequestToken, a la que hay que pasar además de los parámetros de OAuth, el parámetro “scope” por POST. Este parámetro scope debe venir definido en la documentación de cada API de google y en nuestro caso, en el que estamos probando la API de configuración de email de Google apps, podemos encontrar que toma el valor https://apps-apis.google.com/a/feeds/emailsettings/2.0/
  • Al contrario que en twitter, es necesario poner explícitamente el parámetro de callback_uri para obtener el token de solicitud

Código

Con todas estas consideraciones, podemos realizar una adaptación de la aplicación bt descrita con detalle en la entrada anterior, aunque en esta ocasión nos conformaremos con una aplicación todavía más sencilla, ya que simplemente mostrará al usuario el token de acceso. Esta aplicación podría servir de base para una aplicación real en la que se utilizara con este token de acceso la API de Google para configurar la cuenta de correo del usuario en Google Apps en su lugar.

# -*- encoding: utf-8 -*-
from bottle import default_app, get, post, template, request, static_file, response
import requests
from requests_oauthlib import OAuth1
from urlparse import parse_qs

REQUEST_TOKEN_URL = "https://www.google.com/accounts/OAuthGetRequestToken"
AUTHENTICATE_URL = "https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token="
ACCESS_TOKEN_URL = "https://www.google.com/accounts/OAuthGetAccessToken"

CONSUMER_KEY = "........apps.googleusercontent.com"
CONSUMER_SECRET = "m.....a"
# Definimos los parámetros SCOPE y CALLBACK_URI
SCOPE = "https://apps-apis.google.com/a/feeds/emailsettings/2.0/"
CALLBACK_URI = "http://bt2-amolina.rhcloud.com/oauth2callback"

TOKENS = {}

def get_request_token():
# La cabecera oauth lleva en este caso el parámetro callback_uri
    oauth = OAuth1(CONSUMER_KEY,
                   client_secret=CONSUMER_SECRET,
                   callback_uri=CALLBACK_URI,
    )
# Enviamos por POST el parámetro scope
    r = requests.post(url=REQUEST_TOKEN_URL, auth=oauth, data={"scope":SCOPE})
    credentials = parse_qs(r.content)
    TOKENS["request_token"] = credentials.get('oauth_token')[0]
    TOKENS["request_token_secret"] = credentials.get('oauth_token_secret')[0]

def get_access_token(TOKENS):
    oauth = OAuth1(CONSUMER_KEY,
                   client_secret=CONSUMER_SECRET,
                   resource_owner_key=TOKENS["request_token"],
                   resource_owner_secret=TOKENS["request_token_secret"],
                   verifier=TOKENS["verifier"],
    )

    r = requests.post(url=ACCESS_TOKEN_URL, auth=oauth)
    credentials = parse_qs(r.content)
    TOKENS["access_token"] = credentials.get('oauth_token')[0]
    TOKENS["access_token_secret"] = credentials.get('oauth_token_secret')[0]

@get('/')
def index():
    get_request_token()
    authorize_url = AUTHENTICATE_URL + TOKENS["request_token"]
    return template('index.tpl', authorize_url=authorize_url)

@get('/oauth2callback')
def get_verifier():
    TOKENS["verifier"] = request.query.oauth_verifier
    get_access_token(TOKENS)
# Simplemente mostramos el token de acceso para verificar el funcionamiento correcto
    return TOKENS[access_token]

import os
from bottle import TEMPLATE_PATH
TEMPLATE_PATH.append(os.path.join(os.environ['OPENSHIFT_HOMEDIR'],
                    'app-root/runtime/repo/wsgi/views/'))

application=default_app()

Conclusiones

Aunque de forma mucho más breve que en la entrada anterior, ya que puede ser pesado repetir lo mismo en tan poco tiempo, hemos readaptado el código de nuestra mini-aplicación que nos permitía usar OAuth con twitter a un caso bastante diferente, en el que usamos la API de Google Apps, siendo necesario en este caso añadir dos parámetros adicionales que twitter no exigía (callback_uri y scope).

De nuevo dejaremos durante algún tiempo esta mini-aplicación desplegada para pruebas en bt2-amolina.rhcloud.com/, aunque de nuevo cabe advertir que permanecerá allí sólo temporalmente, ya que borraré esa aplicación cuando necesite utilizar alguno de los gears de mi cuenta de OpenShift.

Actualización [16/12/2013]: La aplicación bt2-amolina.rhcloud.com ya no está disponible.

, , , , ,

  1. Deja un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: