Passer au contenu principal

Création d’une signature

Cette page explique comment générer une signature OAuth 1.0a HMAC-SHA1 pour une requête HTTP. Cette signature pourra être transmise à la X API dans le cadre d’une requête autorisée, comme décrit dans autoriser une requête. La requête utilisée pour illustrer la signature est une requête HTTP POST envoyée à https://api.x.com/1.1/statuses/update.json. La requête brute ressemble à ceci :
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
Collecte de la méthode de requête et de l’URL Pour produire une signature, commencez par déterminer la méthode HTTP et l’URL de la requête. Puisqu’ils sont connus au moment de la création de la requête, il est facile de les récupérer. La méthode de la requête sera presque toujours GET ou POST pour les requêtes X API.
Méthode HTTPPOST
L’URL de base est l’URL vers laquelle la requête est envoyée, sans chaîne de requête ni paramètres de fragment. Il est important d’utiliser le protocole correct ici, assurez-vous donc que la partie « https:// » de l’URL correspond à la requête réellement envoyée à l’API.

Collecte des paramètres

Ensuite, récupérez tous les paramètres inclus dans la requête. Il existe deux emplacements possibles pour ces paramètres supplémentaires : l’URL (dans la chaîne de requête) et le corps de la requête. L’exemple de requête comprend un seul paramètre dans les deux emplacements :
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
Une requête HTTP contient des paramètres qui sont encodés pour l’URL, mais vous devez en récupérer les valeurs brutes. En plus des paramètres de requête, chaque paramètre oauth_* doit être inclus dans la signature, vous devez donc également les récupérer. Voici les paramètres provenant de l’étape autoriser une requête :
statusHello Ladies + Gentlemen, a signed OAuth request!
include_entitiestrue
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
oauth_signature_methodHMAC-SHA1
oauth_timestamp1318622958
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
oauth_version1.0
Ces valeurs doivent être encodées dans une seule chaîne, qui sera utilisée plus tard. Le processus pour construire cette chaîne est très spécifique :
  1. Encoder en pourcentage chaque clé et chaque valeur qui sera signée.
  2. Trier la liste des paramètres par ordre alphabétique [1] selon la clé encodée [2].
  3. Pour chaque paire clé/valeur :
  4. Ajouter la clé encodée à la chaîne de sortie.
  5. Ajouter le caractère « = » à la chaîne de sortie.
  6. Ajouter la valeur encodée à la chaîne de sortie.
  7. S’il reste d’autres paires clé/valeur, ajouter un caractère « & » à la chaîne de sortie.  
[1] La spécification OAuth indique de trier lexicographiquement, ce qui correspond au tri alphabétique par défaut pour de nombreuses bibliothèques. [2] Dans le cas de deux paramètres ayant la même clé encodée, la spécification OAuth indique de continuer le tri en se basant sur la valeur. Cependant, X n’accepte pas les clés en double dans les requêtes d’API.   Chaîne de paramètres La chaîne de paramètres suivante sera produite en répétant ces étapes avec les paramètres collectés ci‑dessus :
statusHello Ladies + Gentlemen, a signed OAuth request!
include_entitiestrue
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
oauth_signature_methodHMAC-SHA1
oauth_timestamp1318622958
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
oauth_version1.0

Création de la chaîne de base de la signature

Les trois valeurs collectées jusqu’à présent doivent être concaténées pour former une seule chaîne, à partir de laquelle la signature sera générée. La spécification OAuth appelle cela la chaîne de base de la signature. Pour encoder la méthode HTTP, l’URL de base et la chaîne de paramètres en une seule chaîne :
  1. Convertissez la méthode HTTP en majuscules et initialisez la chaîne de sortie avec cette valeur.
  2. Ajoutez le caractère ‘&’ à la chaîne de sortie.
  3. Encodez au format pourcentage l’URL et ajoutez-la à la chaîne de sortie.
  4. Ajoutez le caractère ‘&’ à la chaîne de sortie.
  5. Encodez au format pourcentage la chaîne de paramètres et ajoutez-la à la chaîne de sortie.  
Cela produira la chaîne de base de la signature suivante :
POST&https%3A%2F%2Fapi.x.com%2F1.1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521
Assurez-vous d’appliquer un encodage pourcent à la chaîne de paramètres. La chaîne de base de la signature doit contenir exactement 2 caractères esperluette « & ». Les caractères pourcentage « % » dans la chaîne de paramètres doivent être encodés en %25 dans la chaîne de base de la signature.

Obtention d’une clé de signature

Les dernières données à collecter sont des secrets qui identifient l’App X effectuant la requête, ainsi que l’utilisateur au nom duquel la requête est effectuée. Il est très important de noter que ces valeurs sont extrêmement sensibles et ne doivent jamais être partagées avec qui que ce soit. La valeur qui identifie votre App auprès de X est appelée le consumer secret et se trouve dans la Console de développement, sur la page de détails de l’App. Cette valeur sera la même pour chaque requête envoyée par votre App X.
Consumer secretkAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw
La valeur qui identifie le compte au nom duquel votre application agit est appelée le secret de jeton OAuth. Cette valeur peut être obtenue de plusieurs manières, qui sont toutes décrites dans la section obtention de jetons d’accès.
Secret de jeton OAuthLswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
Une fois encore, il est très important de garder ces valeurs strictement privées à votre application. Si vous pensez que vos valeurs ont été compromises, régénérez vos jetons (les jetons figurant sur cette page ont été marqués comme invalides pour des requêtes réelles). Ces deux valeurs doivent être combinées pour former une clé de signature qui sera utilisée pour générer la signature. La clé de signature est simplement le secret de jeton encodé en pourcentage : Notez qu’il existe certains flux, par exemple lors de l’obtention d’un jeton de requête, où le secret de jeton n’est pas encore connu. Dans ce cas, la clé de signature doit être composée du consumer secret encodé en pourcentage suivi d’un caractère « & ».
Clé de signaturekAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE

Calcul de la signature

Enfin, la signature est calculée en passant la chaîne de base de la signature et la clé de signature à l’algorithme de hachage HMAC-SHA1. Les détails de l’algorithme sont expliqués dans la description de la fonction hash_hmac. Le résultat de la fonction de signature HMAC est une chaîne binaire. Celle-ci doit être encodée en base64 pour produire la chaîne de la signature. Par exemple, le résultat obtenu à partir de la chaîne de base et de la clé de signature fournies sur cette page est 2E CF 77 84 98 99 6D 0D DA 90 5D C7 17 7C 75 07 3F 3F CD 4E. Cette valeur, une fois convertie en base64, est la signature OAuth pour cette requête :
OAuth signatureLs93hJiZbQ3akF3HF3x1Bz8/zU4=