Comment créer correctement la chaîne de base de signature oauth?

Je souhaite implémenter le protocole OAuth 1.0 afin de pouvoir utiliser COPY . Mais quand j’ai implémenté le protocole OAuth en C ++ afin d’obtenir un jeton de requête et envoyé cette requête pour la copier, elle renvoie la signature invalide et je ne peux pas comprendre ce qui ne va pas dans ma signature. Voici tous les parameters que je génère par mon programme:

oauth_nonce=xoviybpokqnxdwlnkeoorawfijgezr oauth_timestamp=1381745375 oauth_callback=http%3A%2F%2Fcopy-oauth.local%2Fget_access_token.php oauth_signature_method=HMAC-SHA1 

C’est la chaîne de base que j’ai utilisée afin de générer un jeton:

OBTENIR

C’est la clé pour générer une signature:

[Mon secret de consommateur, 48 symboles] &

Voici la signature que j’ai reçue après base64 et codée pour cent:

lNaaOaWyGtkJWj% 2BVLjLlKTVGYL0% 3D

Et la dernière chose est d’envoyer tous les parameters au serveur. Pour cela, j’utilise libcurl:

 char * abc="https://api.copy.com/oauth/request/?oauth_callback=http%3A%2F%2Fcopy-oauth.local%2Fget_access_token.php&oauth_consumer_key=[my 32 symbols key]&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1381745375&oauth_nonce=xoviybpokqnxdwlnkeoorawfijgezr&oauth_signature=lNaaOaWyGtkJWj%2BVLjLlKTVGYL0%3D"; CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, TRUE); curl_easy_setopt(curl, CURLOPT_CAINFO, "C:\\a\\a\\a\\cacert.pem"); curl_easy_setopt(curl, CURLOPT_URL, abc); res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); /* always cleanup */ curl_easy_cleanup(curl); } curl_global_cleanup(); 

Ensuite, ma console affichera:

oauth_error_message = oauth_problem% 3Dsignature_invalid% 26debug_sbs …

Quel est le problème dans ma mise en œuvre?

Le problème principal était que oauth_callback devait être two time percent encoded à two time percent encoded afin de créer la chaîne de base de la signature. C’est la chaîne que j’envoie à la demande:

oauth_callback="http://copy-oauth.local/get_access_token.php"

Et c’est la chaîne que j’ajoute à la chaîne de base de la signature:

http%253A%252F%252Fcopy-oauth.local%252Fget_access_token.php

Voici quelques points qui viennent immédiatement à l’esprit:

  1. Votre chaîne de base de signature doit inclure le paramètre oauth_callback

  2. oauth_token ne devrait pas être inclus dans la chaîne de base de la signature car vous ne l’incluez pas dans vos parameters de chaîne de requête

  3. Le chemin de votre URL ne doit pas se terminer par une barre oblique sauf si vous incluez également ceci dans la chaîne de base de votre signature:

      char * abc="https://api.copy.com/oauth/request?oauth_callback= ... 
  4. Vous devriez enlever le caractère ‘&’ à la fin de votre chaîne de requête