Comment se connecter en python à une API utilisant le protocole d’authentification WSSE

Si vous devez vous connecter en utilisant python à une API via le protocole d’authentification WSSE, vous risquez de vous retrouver un peu court en documentation technique. Voici comment faire.

python-logo

La première étape est d’utiliser le module httplib2.

Vous allez ensuite devoir passer l’authentification en faisant quelque chose comme cela:

url = 'http://www.example.com/login'   
body = {'USERNAME': 'foo', 'PASSWORD': 'bar'}
headers = {'X-WSSE': 'UsernameToken Username="teste", PasswordDigest="be9ASEq4xlatOwt52K7MvZLALlI=", Nonce="MTI1MmUyOTkwYTY5NDQwOQ==", Created="2015-04-04T17:32:10Z"'}

Vous pouvez créer cette chaîne de caractère en utilisant le site internet teria.

Il faut ensuite instancier un objet et appeler la méthode request de la façon suivante:

http = httplib2.Http()
response, content = http.request(url, 'POST', headers=headers, body=urllib.urlencode(body))

Il s’agit ni plus ni moins à ce stade de tester si la connexion est correcte. Si c’est le cas et que vous réussissez à appeler la méthode souhaitée côté serveur, il n’est reste ni plus ni moins que la validité de votre token de connexion est limitée pour des raisons de sécurité – et qu’il est hors de question de devoir générer ce code manuellement en utilisant le site internet teria.

La prochaine étape consiste donc à générer un nonce automatiquement, puis le datetime created ainsi que le password digest. Pour le nonce, il s’agit d’un nombre aléatoire à créer et à encoder en base64. Pour le format de la date, vous pouvez adopter le code suivant:

drift = datetime.timedelta(seconds=0)
created = (datetime.datetime.utcnow() + drift).isoformat() + 'Z'
print created

En ce qui concerne le nonce, vous pouvez adapter le code javascript suivant (rien de très compliqué à ce stade):

function generateNonce(length) {
    var nonceChars = "0123456789abcdef";
    var result = "";
    for (var i = 0; i < length; i++) {
        result += nonceChars.charAt(Math.floor(Math.random() * nonceChars.length));
    }
    return result;
}

Il faut ensuite savoir comment encoder le tuple (nonce, created, password) pour créer le password digest. Il faut savoir comment ces éléments se combinent du côté serveur pour encoder correctement ces éléments et créer le bon token d’identification qui vous permettra d’accéder aux données retournées par l’API. Tous ces éléments (nonce, created) peuvent et doivent être crées dans des classes / fonctions pour clarifier votre code.

Une fois ces éléments prêts, vous pouvez y aller et exécuter un appel test au serveur.