2010-08-10 8 views
1

Je me demandais si quelque chose pouvait éclairer l'endroit où je pourrais me tromper.Le codage décodeur django base64 renvoie une valeur différente

J'ai besoin de générer une clé signé pour une utilisation avec Gigya une plate-forme OpenAuth

C'est une reprise de leurs informations Ruby, http://wiki.gigya.com/020_Developer_Guide/70_Server_Side_API_(REST)#tab-2

Voici ce que j'ai jusqu'ici.

#@ escape the status message and replace all + with %20 as spaces are CGI.escaped to + 
>message_text = re.subn(r'\+',"%20","Hello")[0] 
user = 1 

#@ here are the parameters you need to supply from your Gigya site's settings page. 
> api_url = "http://socialize-api.gigya.com/socialize.setStatus" 
api_key = "2_qf6pKytdGqrvufl3TW2jY-D6nDaMFsHJ1mg4ZR-xtjyq-PtyyDnwFxRelMdvdAdM" #not the real key 
gigya_secret_key = "Vf6IE6X59tKwDYuvKgsOOA5W6Gon4l6b9C+xVx0zsbY=" 

#@ decode secret key and prepare nonce. 
>gigya_secret = a2b_base64('f6IE6X59tKwDYuvKgsOOA5W6Gon4l6b9C+xVx0zsbY=') 
timestamp = int(time.time()) 
# timestamp = 1281427277 

nonce = "%(a)d%(b)i" % {'a':1, 'b':timestamp,} 
http_method = "GET" 

#@ parameters are ordered alphabetically, base string include HTTP method call and its parameters, all separated with unescaped "&" 
>parameters = 'apiKey=U\xfe\x88\x13\xa5\xf9\xf6\xd2\xb0\r\x8b\xaf*\x0b\x0e8\x0eV\xe8j'\xe2^\x9b\xf4/\x97\xc6\xfd3\xb1\xb6&nonce=11281427277&status=Hello&timestamp=1281427277&uid=1' 

>encoded_api = api_url.replace('//', '%3A').replace('/', '%2F') 
# http:%3Asocialize-api.gigya.com%2Fsocialize.setStatus 

>encoded_par_1 = re.subn(r'\&', "%26", parameters)[0] 
# apiKey=U\xfe\x88\x13\xa5\xf9\xf6\xd2\xb0\r\x8b\xaf*\x0b\x0e8\x0eV\xe8j'\xe2^\x9b\xf4/\x97\xc6\xfd3\xb1\xb6%26nonce=11281427277%26status=Hello%26timestamp=1281427277%26uid=1 

encoded_parameters = re.subn(r'\=', "%3D", encoded_par_1)[0] 
# apiKey%3DU\xfe\x88\x13\xa5\xf9\xf6\xd2\xb0\r\x8b\xaf*\x0b\x0e8\x0eV\xe8j'\xe2^\x9b\xf4/\x97\xc6\xfd3\xb1\xb6%26nonce%3D11281427277%26status%3DHello%26timestamp%3D1281427277%26uid%3D1 
>base_string = '%(a)s&%(b)s&%(c)s' % {'a':http_method, 'b':encoded_api, 'c':encoded_parameters, } 
# GET&http:%3Asocialize-api.gigya.com%2Fsocialize.setStatus&apiKey%3DU\xfe\x88\x13\xa5\xf9\xf6\xd2\xb0\r\x8b\xaf*\x0b\x0e8\x0eV\xe8j'\xe2^\x9b\xf4/\x97\xc6\xfd3\xb1\xb6%26nonce%3D11281427277%26status%3DHello%26timestamp%3D1281427277%26uid%3D1 

#@ hmac/sha1 encription for the gigya secret and the base_string 

>hmacsha1 = hmac.new(gigya_secret, base_string, hashlib.sha1) 

>hmacsha1 = binascii.b2a_base64(hmacsha1.digest())[:-1] 
# mMWb+7VE7L7+csYwwI00vWYu8IM= 

>gigya_sign = urlquote(b2a_base64(hmacsha1).replace('\n', '').replace('\+', '%2B').replace('\/', '%2F')) 
# bU1XYis3VkU3TDcrY3NZd3dJMDB2V1l1OElNPQ%3D%3D 

#@ finalized api request url with the signed signature 
>request_url = '%(a)s?apiKey=%(b)s&nonce=%(c)s&status=%(d)s&timestamp=%(e)s&uid=%(f)s&sig=%(g)s' % {'a':api_url, 'b':api_key, 'c':nonce, 'd':message_text, 'e':timestamp, 'f':user, 'g':gigya_sign } 
# request_url = http://socialize-api.gigya.com/socialize.setStatus?apiKey=2_qf6pKytdGqrvufl3TW2jY-D6nDaMFsHJ1mg4ZR-xtjyq-PtyyDnwFXralMdvdAdM&nonce=11281427277&status=Hello&timestamp=1281427277&uid=1&sig=bU1XYis3VkU3TDcrY3NZd3dJMDB2V1l1OElNPQ%3D%3D 

Maintenant, je semble toujours obtenir le mauvais résultat pour la clé.

Toute aide serait grandement appréciée.

+0

Il serait plus simple d'aider si vous ajoutez les valeurs des différentes variables entre les lignes de code. –

+0

Oui, je suppose que cela pourrait aider. J'ai mis à jour avec quelques chiffres et résultats, merci d'y jeter un coup d'oeil. – ApPeL

+0

Beaucoup mieux :-) Quel est "le mauvais résultat"? Avez-vous une erreur? Quelle "clé" est erronée? –

Répondre

1

Je ne trouve pas la valeur pour signature n'importe où. Il est possible que vous encodez la signature deux fois avec base64:

>hmacsha1 = binascii.b2a_base64(hmacsha1.digest())[:-1] 
# mMWb+7VE7L7+csYwwI00vWYu8IM= 

>gigya_sign = urlquote(b2a_base64(hmacsha1).replace('\n', '').replace('\+', '%2B').replace('\/', '%2F')) 
# bU1XYis3VkU3TDcrY3NZd3dJMDB2V1l1OElNPQ%3D%3D 

Notez que vous attribuez hmacsha1 avec la valeur codée base64 du digestat dans la première ligne (pourquoi omettez-vous le dernier caractère du résultat?) et vous l'encoder à nouveau avec b2a_base64. Je me demande également pourquoi vous remplacez + et / manuellement; urlquote() devrait déjà faire cela (sinon, je dirais que c'est un bug dans urlquote() qui devrait être corrigé).

Questions connexes