Firma de solicitudes en Python para OAuth

Actualmente estoy conectando la API de Twitter utilizando el protocolo OAuth y escribiendo el código en Python. Como la mayoría de los usuarios, creo que la parte más difícil de las especificaciones es tratar con firmas.

Después de deambular por la web en busca de una solución, decidí buscar mi código personalizado para comprender mejor lo que está sucediendo.

Por el bien de otros usuarios, estoy publicando aquí una implementación muy simple y breve de las especificaciones de la firma SHA1 en Python:

import hmac

from hashlib import sha1
from urllib import quote, urlencode
from base64 import b64encode
from urlparse import urlparse

def sign_request_sha1(url,method,data,secret=""):
  pu = urlparse(urlparse(url).geturl())

  normUrl = "%s://%s%s%s" % (
      pu.scheme,
      pu.hostname,
      "" if not pu.port or {"http":80,"https":443}[pu.scheme] == pu.port else ":%d" % pu.port,
      pu.path,
                            )

  names = data.keys()
  names.sort()

  sig = "%s&%s&%s" % (
          method.upper(),
          quote(normUrl,''),
          quote("&".join(["%s=%s" % (k,quote(data[k].encode('utf-8'),'')) for k in names]),''),
                     )

  key = "%s&%s" % (quote(CONSUMER_SECRET.encode('utf-8'),''),secret)

  return b64encode(hmac.new(key,sig,sha1).digest())

Los parámetros de entrada a la función son:

url: la url a la que va a llamar para la solicitud específica de OAuth.Método: este debe ser "GET" o "POST" según la forma en que emitirá su solicitud.datos: un diccionario que contiene todos los parámetros de las solicitudes, incluido cualquier argumento personalizado pero excluyendo el "oauth_signature" uno (por razones obvias).secreto: un token secreto que recibió en la fase inicial del protocolo.

Lo probé con Twitter y parece funcionar, pero me gustaría recibir algunos comentarios sobre errores, mejoras, etc.

Por último, aquí encontrará un fragmento de código que llama al código para la fase inicial de "token de solicitud":

from random import getrandbits
from base64 import b64encode
from time import time

def twitter_request_token(req,callback,errback):
  req_url="http://twitter.com:80/oauth/request_token"

  data = { \
    "oauth_consumer_key" : CONSUMER_KEY,
    "oauth_nonce" : b64encode("%0x" % getrandbits(256))[:32],
    "oauth_timestamp" : str(int(time())),
    "oauth_signature_method" : "HMAC-SHA1",
    "oauth_version" : "1.0",
    "oauth_callback" : "http://localhost:8080/",
         }

  data["oauth_signature"] = sign_request_sha1(req_url,"GET",data)

Gracias.

Respuestas a la pregunta(1)

Su respuesta a la pregunta