python oauth sha1 hmac

Implementación HMAC-SHA1 en python



oauth (6)

Intento usar OAuth de un sitio web, que requiere que el método de firma sea ''HMAC-SHA1'' solamente.

Me pregunto cómo implementar esto en Python?


Finalmente, aquí hay una solución realmente funcional (probada con Python 3) que utiliza oauthlib .

Utilizo el primer paso de OAuth dado como ejemplo en el RTF oficial 1 :

Client Identifier: dpf43f3p2l4k3l03 Client Shared-Secret: kd94hf93k423kf44 POST /initiate HTTP/1.1 Host: photos.example.net Authorization: OAuth realm="Photos", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_signature_method="HMAC-SHA1", oauth_timestamp="137131200", oauth_nonce="wIjqoS", oauth_callback="http%3A%2F%2Fprinter.example.com%2Fready", oauth_signature="74KNZJeDHnMBp0EMJ9ZHt%2FXKycU%3D"

El valor de oauth_signature es lo que nos gustaría calcular.

Lo siguiente define lo que queremos firmar:

# There is no query string present. # In case of http://example.org/api?a=1&b=2 - the value # would be "a=1&b=2". uri_query="" # The oauthlib function ''collect_parameters'' automatically # ignores irrelevant header items like ''Content-Type'' or # ''oauth_signature'' in the ''Authorization'' section. headers={ "Authorization": ( ''OAuth realm="Photos", '' ''oauth_nonce="wIjqoS", '' ''oauth_timestamp="137131200", '' ''oauth_consumer_key="dpf43f3p2l4k3l03", '' ''oauth_signature_method="HMAC-SHA1", '' ''oauth_callback="http://printer.example.com/ready"'' ) } # There''s no POST data here - in case it was: x=1 and y=2, # then the value would be ''[("x","1"),("y","2")]''. data=[] # This is the above specified client secret which we need # for calculating the signature. client_secret="kd94hf93k423kf44"

Y aquí vamos:

import oauthlib.oauth1.rfc5849.signature as oauth params = oauth.collect_parameters( uri_query="", body=data, headers=headers, exclude_oauth_signature=True, with_realm=False ) norm_params = oauth.normalize_parameters(params) base_string = oauth.construct_base_string( "POST", "https://photos.example.net/initiate", norm_params ) sig = oauth.sign_hmac_sha1( base_string, client_secret, '''' # resource_owner_secret - not used )

from urllib.parse import quote_plus print(sig) # 74KNZJeDHnMBp0EMJ9ZHt/XKycU= print(quote_plus(sig)) # 74KNZJeDHnMBp0EMJ9ZHt%2FXKycU%3D


Hay múltiples bibliotecas de Python disponibles en el sitio web de oauth , pero si solo está interesado en una implementación específica, puede echarle un vistazo a una de ellas .


Por el amor de Dios, si haces NADA con oauth, utiliza la biblioteca de requests para Python. Traté de implementar HMAC-SHA1 usando la biblioteca hmac en Python y son muchos dolores de cabeza, tratando de crear la cadena base oauth correcta y demás. Simplemente use solicitudes y es tan simple como:

>>> import requests >>> from requests_oauthlib import OAuth1 >>> url = ''https://api.twitter.com/1.1/account/verify_credentials.json'' >>> auth = OAuth1(''YOUR_APP_KEY'', ''YOUR_APP_SECRET'', ''USER_OAUTH_TOKEN'', ''USER_OAUTH_TOKEN_SECRET'') >>> requests.get(url, auth=auth)

Autenticación de solicitudes

Solicita Oauth Library


Pseudocodish:

def sign_request(): from hashlib import sha1 import hmac # key = CONSUMER_SECRET& #If you dont have a token yet key = "CONSUMER_SECRET&TOKEN_SECRET" # The Base String as specified here: raw = "BASE_STRING" # as specified by oauth hashed = hmac.new(key, raw, sha1) # The signature return hashed.digest().encode("base64").rstrip(''/n'')

Los errores de firma generalmente residen en la serie básica, asegúrese de comprender esto (según lo establecido por la especificación OAuth1.0 aquí: http://tools.ietf.org/html/draft-hammer-oauth-10#section-3.4.1 ).

Las siguientes entradas se utilizan para generar la cadena base de la firma:

  1. Método HTTP (por ejemplo, GET)
  2. Ruta (por ejemplo, http://photos.example.net/photos )
  3. Parámetros, alfabéticamente, como (saltos de línea para la legibilidad):

    file=vacation.jpg &oauth_consumer_key=dpf43f3p2l4k3l03 &oauth_nonce=kllo9940pd9333jh &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1191242096 &oauth_token=nnch734d00sl2jdk &oauth_version=1.0 &size=original

Concatenar y URL codificar cada parte y termina como:

GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26 oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26 oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26 oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal


Puede intentar seguir el método.

def _hmac_sha1(input_str): raw = input_str.encode("utf-8") key = ''your_key''.encode(''utf-8'') hashed = hmac.new(key, raw, hashlib.sha1) return base64.encodebytes(hashed.digest()).decode(''utf-8'')