Page 1 sur 1

[R] Calcul SHA1 - Authentification

Posté : sam. 11 janv. 2014 16:15
par phidyos
Bonjour.
Je souhaite m'authentifier sur un site.
Je ne souhaite pas utiliser ie.au3 (cela fonctionne par cette méthode mais elle est très gourmande en mémoire et processus puisque cela lance internet explorer).

La méthode d'authentification est la suivante:
-Récupération d'un nonce à partir d'une première requête
-Calcul du token selon la formule donnée par le site:
Implementation Notes

Use this algorithm to calculate the token from nonce and password:

Code : Tout sélectionner

token = SHA1(nonce + SHA1(password))
where SHA1 has hex encoded output like sha1sum command

This linux command line sample works:

Code : Tout sélectionner

sha=`echo -n "$password" | sha1sum | awk '{print $1}'`
token=`echo -n "$nonce$sha" | sha1sum | awk '{print $1}'`
A nonce CAN NOT be reused. The nonce returned by last /user operation MUST be used for calculating the token.
-Envoi d'une requete d'authentification contenant le token et le username

J'utilise un UDF SHA1.au3 obtenu à cette adresse: http://www.autoitscript.com/forum/topic ... e-version/

Voici mon code:

Code : Tout sélectionner

#include <string.au3>
#include <array.au3>
#include <sha1.au3>

$username="******.*******%40gmail.com"
$password="************"

;Récupération de la page d'init
$array=_StringBetween(BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/init"),4),'"','"')

;Récupération de "nonce" en le convertissant en hexa
$nonce=StringTrimLeft(StringToBinary($array[4]),2)

;Calcul du sha
$sha = _SHA1($password)

;Calcul du token
$token= StringTrimLeft(_SHA1($nonce&$sha),2)

;Envoi de la requete contenant le username et le token
$result=BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/login?username="&$username&"&token="&$token),4)
ConsoleWrite("https://my.zipato.com:443/zipato-web/rest/user/login?username="&$username&"&token="&$token&@cr&$result)

 
Biensur, à chaque fois, j'obtiens un joli {"success":false,"error":"authentication error",......}.
Est-ce que je fais une erreur bête quelque part?
Je pense que c'est la retranscription de la formule à appliquer qui est mauvaise mais je ne vois pas comment faire...
Merci d'avance pour votre aide !

Re: [..] Calcul SHA1 - Authentification

Posté : sam. 11 janv. 2014 20:15
par jchd
_SHA1 renvoie un binaire. Si cette valeur est par la suite convertie en chaîne pour concaténation avec le nonce, alors ... :wink:

Re: [..] Calcul SHA1 - Authentification

Posté : sam. 11 janv. 2014 21:51
par phidyos
J'ai modifié le script en fonction de votre conseil mais cela ne donne rien...
Je dois passer à côté de quelque chose....

Code : Tout sélectionner

#include <string.au3>
#include <array.au3>
#include <sha1.au3>

$username="****.******%40gmail.com"
$password="***********"

;Récupération de la page d'init
$array=_StringBetween(BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/init")),'"','"')

;Récupération de "nonce"
$nonce=$array[4]
ConsoleWrite("Nonce: "&$nonce&@CR)

;Calcul du sha
$sha = BinaryToString(_SHA1($password))
ConsoleWrite("Sha: "&$sha&@CR)

;Calcul du token
$token= StringTrimLeft(_SHA1($nonce&$sha),2)
ConsoleWrite("Token: "&$token&@CR)

;Envoi de la requete contenant le username et le token
$result=BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/login?username="&$username&"&token="&$token),4)
ConsoleWrite("https://my.zipato.com:443/zipato-web/rest/user/login?username="&$username&"&token="&$token&@cr&$result)
 
Je récupère le nonce (chaine de caractères).
Je calcule le SHA1 du password que je convertit en chaine de caractères.
Je calcule le SHA1 de la concaténation du nonce et du sha pour obtenir le token...

Re: [..] Calcul SHA1 - Authentification

Posté : sam. 11 janv. 2014 22:19
par jguinch
A priori, la valeur de $nonce correspond à "jsessionid".
Le problème ne vient-il pas de là ?

Code : Tout sélectionner

$nonce = StringRegExpReplace( BinaryToString(InetRead("https://my.zipato.com:443/zipato-web/rest/user/init")) , '(?s).*"nonce"\h:\h"([^"]+).*', "$1")
 

Re: [..] Calcul SHA1 - Authentification

Posté : dim. 12 janv. 2014 00:14
par phidyos
Merci pour cette réponse. Je pense que le problème se situe effectivement du côté du JSESSIONID.
Voici ce que je viens de trouver à propos de l'API du site auquel je veux me connecter:
'/user/login' also needs JSESSIONID.

It's not problem when calling from browser because it is automatically sent in cookies.

You would need to set some curl options to send cookies with JSESSIONID.

All other request will also need valid (authenticated) JSESSIONID.
Sinon, pour vous, est-ce que ma méthode de calcul du token vous parait correcte?
Merci encore...

Re: [..] Calcul SHA1 - Authentification

Posté : dim. 12 janv. 2014 04:11
par jchd
Essaye quand même ceci :
► Afficher le texte

Re: [..] Calcul SHA1 - Authentification

Posté : dim. 12 janv. 2014 18:22
par phidyos
Merci beaucoup pour l'aide mais cela ne fonctionne pas.
Je pense qu'il faut gérer la transmission du jsessionid par cookie.
J'ai trouvé ce lien:

http://brugbart.com/setting-http-request-headers-autoit

On verra bien si j'arrive à quelque chose...

Re: [..] Calcul SHA1 - Authentification

Posté : lun. 13 janv. 2014 18:55
par phidyos
Bon, après avoir galéré quelques heures à apprendre le fonctionnement des cookies et de winhttp, j'ai enfin réussi...
Il y avait plusieurs problèmes:

1/Il fallait bien envoyer un header contenant le cookie avec le jsessionid
2/il fallait respecter la casse dans la formule du SHA1 ! Donc un stringlower() sur le calcul de $sha et tout était réglé!

Voici le script final fonctionnel:

Code : Tout sélectionner

#include <string.au3>
#include <array.au3>
#include <Crypt.au3>

$username = "******.*******%40gmail.com"
$password = "*********"

;Requête d'initialisation d'authentification
$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", "https://my.zipato.com:443/zipato-web/rest/user/init", False)
$oHTTP.Send()

;Récupérer le cookie
$array_cookie=GetCookies($oHTTP)
$string_cookie_jsessionid=$array_cookie[0]
ConsoleWrite($string_cookie_jsessionid&@CR)

;Récupération du contenu de la page d'init
$reponse=$oHTTP.ResponseText()
$array = _StringBetween($reponse, '"', '"')

;Récupération du jsessionid
$jsessionid=$array[2]
ConsoleWrite("jsessionid : "&$jsessionid&@CR)

;Récupération du nonce
$nonce=$array[4]
ConsoleWrite("Nonce : "&$nonce&@CR)

;Calcul du sha
$sha = stringlower(stringtrimleft(_Crypt_HashData($password, $CALG_SHA1),2))
ConsoleWrite("Sha: " & $sha & @CR)

;Calcul du token
$token = StringLower(StringTrimLeft(_Crypt_HashData($nonce&$sha, $CALG_SHA1), 2))
ConsoleWrite("Token: " & $token & @CR)

;Création de l'URL d'authentification
$url_auth="https://my.zipato.com:443/zipato-web/rest/user/login?username=" & $username & "&token=" & $token

;Envoi de la requête d'authentification avec le cookie en header
$oHTTP=ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", $url_auth, False)
$oHTTP.setRequestHeader("Cookie",$string_cookie_jsessionid)
$oHTTP.Send()
$reponse=$oHTTP.ResponseText()
ConsoleWrite($reponse&@CR)

;***Func GetCookies() Retourne un $array contenant les cookies
Func GetCookies($objet_HTTP)
    ;Récupérer le header
    Local $HeaderResponses = $objet_HTTP.GetAllResponseHeaders()
    ;Récupérer les lignes de cookies
    Local $array = StringRegExp($HeaderResponses, 'Set-Cookie: (.+)\r\n', 3)
    Return($array)
EndFunc
 
Merci encore de m'avoir aiguillé !