Passer au contenu principal

Autoriser une requête

L’objectif de ce document est de vous montrer comment modifier des requêtes HTTP afin d’envoyer des requêtes autorisées vers la X API. Toutes les API de X sont basées sur le protocole HTTP. Cela signifie que tout logiciel que vous développez et qui utilise les API de X envoie une série de messages structurés aux serveurs de X. Par exemple, une requête pour publier le texte « Hello Ladies + Gentlemen, a signed OAuth request! » en tant que Tweet ressemblera à 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
N’importe quelle bibliothèque HTTP devrait pouvoir générer et envoyer la requête ci-dessus avec un minimum de difficultés. Cependant, la requête ci-dessus est considérée comme invalide, car il n’est pas possible de savoir :
  1. Quelle application effectue la requête
  2. Au nom de quel utilisateur la requête publie
  3. Si l’utilisateur a accordé à l’application l’autorisation de publier en son nom
  4. Si la requête a été altérée par un tiers pendant son acheminement
Pour permettre aux applications de fournir ces informations, l’API de X repose sur le protocole OAuth 1.0a. De façon très simplifiée, l’implémentation de X exige que les requêtes nécessitant une autorisation contiennent un en-tête HTTP Authorization supplémentaire, avec suffisamment d’informations pour répondre aux questions énumérées ci-dessus. Une version de la requête HTTP montrée plus haut, modifiée pour inclure cet en-tête, ressemble à ceci (normalement, l’en-tête Authorization devrait tenir sur une seule ligne, mais il a été renvoyé à la ligne pour plus de lisibilité ici) :
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
Authorization:
OAuth oauth\_consumer\_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth\_signature\_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.x.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
Lorsque cette requête a été créée, elle aurait été acceptée par X API comme valide. Si ce processus de signature vous semble dépasser le périmètre de votre intégration, envisagez d’utiliser les Web Intents, qui n’ont pas besoin d’utiliser OAuth pour interagir avec X API.   Collecte des paramètres Vous pouvez constater que l’en-tête contient 7 paires clé/valeur, où toutes les clés commencent par la chaîne « oauth_ ». Pour toute requête donnée à X API, rassembler ces 7 valeurs et créer un en-tête similaire vous permettra de spécifier l’autorisation pour la requête. La manière dont chaque valeur a été générée est décrite ci‑dessous : Consumer key Le paramètre oauth_consumer_key identifie l’application qui effectue la requête. Obtenez cette valeur à partir de la page de paramètres de votre App X dans la Console de développement.
oauth_consumer_keyxvz1evFS4wEEPTGEFPHBog
Nonce Le paramètre oauth_nonce est un jeton unique que votre application doit générer pour chaque requête distincte. X utilisera cette valeur pour déterminer si une requête a été soumise plusieurs fois. La valeur pour cette requête a été générée en encodant en base64 32 octets de données aléatoires, puis en supprimant tous les caractères non alphanumériques, mais toute approche produisant une chaîne alphanumérique relativement aléatoire conviendra ici.
oauth_noncekYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg
Signature Le paramètre oauth_signature contient une valeur générée en soumettant tous les autres paramètres de la requête ainsi que deux valeurs secrètes à un algorithme de signature. La signature permet à X de vérifier que la requête n’a pas été modifiée en transit, de vérifier l’application qui envoie la requête et de vérifier que l’application est autorisée à interagir avec le compte de l’utilisateur. Le processus de calcul de oauth_signature pour cette requête est décrit dans Création d’une signature.
oauth_signaturetnnArxj06cWHq44gCs1OSKk/jLY=
Méthode de signature La valeur oauth_signature_method utilisée par X est HMAC-SHA1. Cette valeur doit être utilisée pour toute requête autorisée envoyée à la X API.
oauth_signature_methodHMAC-SHA1
Horodatage Le paramètre oauth_timestamp indique le moment où la requête a été créée. Cette valeur doit correspondre au nombre de secondes écoulées depuis l’époque Unix au moment où la requête est générée, et elle devrait être facilement générable dans la plupart des langages de programmation. X rejettera les requêtes qui ont été créées trop longtemps auparavant. Il est donc important de maintenir l’horloge de l’ordinateur qui génère les requêtes synchronisée avec NTP.
oauth_timestamp1318622958
Jeton Le paramètre oauth_token représente généralement l’autorisation donnée par un utilisateur pour partager l’accès à son compte avec votre application. Il existe quelques requêtes d’authentification pour lesquelles cette valeur n’est pas transmise ou prend une forme différente de jeton, mais ces cas sont décrits en détail dans Obtention de jetons d’accès. Pour la plupart des requêtes d’usage général, vous utiliserez ce que l’on appelle un jeton d’accès. Vous pouvez générer un jeton d’accès valide pour votre compte sur la page des paramètres de votre App X dans la Console de développement.
oauth_token370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb
Version Le paramètre oauth_version doit toujours avoir la valeur 1.0 pour toute requête envoyée à la X API.
oauth_version1.0

Création de la chaîne d’en-tête

Pour créer la chaîne d’en-tête, imaginez que vous écrivez dans une chaîne nommée DST.
  1. Ajoutez la chaîne « OAuth » (y compris l’espace à la fin) à DST.
  2. Pour chaque paire clé/valeur parmi les 7 paramètres listés ci-dessus :
    1. Encodez en pourcentage la clé et ajoutez-la à DST.
    2. Ajoutez le signe égal « = » à DST.
    3. Ajoutez un guillemet double « ” » à DST.
    4. Encodez en pourcentage la valeur et ajoutez-la à DST.
    5. Ajoutez un guillemet double « ” » à DST.
    6. S’il reste des paires clé/valeur, ajoutez une virgule « , » et un espace «  » à DST.
Portez une attention particulière à l’encodage en pourcentage des valeurs lors de la construction de cette chaîne. Par exemple, la valeur oauth_signature de tnnArxj06cWHq44gCs1OSKk/jLY= doit être encodée sous la forme tnnArxj06cWHq44gCs1OSKk%2FjLY%3D. L’application de ces étapes aux paramètres collectés ci-dessus donne la chaîne suivante :
OAuth oauth\_consumer\_key="xvz1evFS4wEEPTGEFPHBog", oauth\_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth\_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth\_signature\_method="HMAC-SHA1", oauth\_timestamp="1318622958", oauth\_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"
Cette valeur doit être utilisée comme en-tête Authorization de la requête.