2013-01-10 2 views
0

Possible Duplicate:
Get contacts using Yahoo Contacts APIAuthentification Oauth HMAC-SHA1 pour obtenir des contacts de Yahoo! Contacts API

Je développe un sysyem pour obtenir des contacts Yahoo auprès des utilisateurs. J'ai complété toutes les étapes de http://developer.yahoo.com/oauth/guide/oauth-auth-flow.html et j'ai déjà eu le jeton d'accès et le secret de jeton.

J'ai problème à signer en utilisant l'algorithme HMAC-SHA1, j'ai suivi les étapes de http://developer.yahoo.com/oauth/guide/oauth-signing.html pour générer la clé de signer, mais quand je demande des contacts d'un utilisateur donné j'obtiens l'erreur:

<yahoo:error xmlns:yahoo='http://yahooapis.com/v1/base.rng' 
    xml:lang='en-US'> 
    <yahoo:description>Please provide valid credentials. OAuth oauth_problem="signature_invalid", realm="yahooapis.com"</yahoo:description> 
</yahoo:error> 

Voici mon code responsable de générer la clé de signature:

$s = 'oauth_consumer_key='.rawurlencode($yahoo_consumer_key).'&'; 
$s .= 'oauth_nonce='.rawurlencode(uniqid()).'&'; 
$s .= 'oauth_signature_method='.rawurlencode('HMAC-SHA1').'&'; 
$s .= 'oauth_timestamp='.rawurlencode(time()).'&'; 
$s .= 'oauth_token='.rawurlencode($ouathToken).'&'; 
$s .= 'oauth_version='.rawurlencode('1.0').'&'; 
$s .= 'realm='.rawurlencode('yahooapis.com'); 

$baseString ='GET&'.rawurlencode('http://social.yahooapis.com/v1/user/'.$guid.'/contacts').'&'.rawurlencode($s); 

$signingKey = rawurlencode($yahoo_consumer_secret).'&'.rawurlencode($ouathTokenSecret); 

$signature = urlencode(base64_encode(hash_hmac('sha1', $baseString, $signingKey, true))); 

curl_setopt_array($ch, array(
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_FOLLOWLOCATION => TRUE, 
      CURLOPT_SSL_VERIFYPEER => false, 
      CURLOPT_SSL_VERIFYHOST => 0, 
      CURLOPT_HTTPGET => true, 
      CURLOPT_POST  => false, 
      CURLOPT_URL => 'http://social.yahooapis.com/v1/user/'.$guid.'/contacts'.  
            '?realm=yahooapis.com'. 
            '&oauth_consumer_key='.$yahoo_consumer_key. 
            '&oauth_nonce='.uniqid(). 
            '&oauth_signature_method=HMAC-SHA1'. 
            '&oauth_timestamp='.time(). 
            '&oauth_token='.$ouathToken. 
            '&oauth_version=1.0'. 
            '&oauth_signature='.$signature 
     )); 

$result = curl_exec($ch); 

Quelqu'un peut m'aider à me dire où est l'erreur? N'ai-je pas généré la clé de signature correctement?

Merci.

Répondre

0

On dirait que vous utilisez urlencode à certains endroits au lieu de rawurlencode tout au long qui utilisera des choses comme "+" au lieu de "% 20" pour un espace. La documentation de Yahoo (pas si bien pour cette zone) montre la chaîne d'en-tête/URL "normalisée" en utilisant rawurlencode au lieu d'urlencode. Autre que la façon dont vous écrivez la demande, cela semble bon.

* Modifié: J'avais mélangé rawurlencode et urlencode. Rawurlencode utilise RFC 3986 qui est requis par OAuth: http://oauth.net/core/1.0/#encoding_parameters

Vous êtes également en double encodage $ s! Ne faites pas cela - lors de la création $ s n'utilisez pas rawurlencode du tout et que l'encoder lorsque vous construisez $ baseString ou URL Encodez-le en haut lorsque vous créez $ s mais ne l'encode pas une seconde fois en $ baseString.

+0

Dans cette ligne: $ baseString = 'GET &'. Rawurlencode ('http://social.yahooapis.com/v1/user/'.$guid.'/contacts'). '&'. Rawurlencode ($ s) Je dois remplacer rawurlencode par urlencode? J'ai essayé beaucoup de manières mais je reçois toujours la même erreur. Pouvez-vous être plus spécifique? – user1519240

+0

Je suis désolé, je l'ai eu complètement à l'envers - TOUT devrait être rawurlencoded, qui utilise RFC 3986. Je les ai mélangés. Cependant, selon la documentation OAuth, seuls les caractères réservés, conformément à la RFC3986, peuvent être codés et tout le reste NE DOIT PAS être codé. Regardez http://oauth.net/core/1.0/ pour vous assurer que vous avez toutes les étapes correctes. J'ai édité ma réponse avec la bonne fonction de PHP - assurez-vous que vous ne mélangez pas/ne correspond pas au brut/urlencoding et que tout est uniforme en utilisant rawurlencode(); – Jack

+0

En outre, vérifiez votre sortie pour vous assurer qu'il n'y a pas de caractères codés qui ne font pas partie de la liste de caractères réservés RFC 3986: PHP fait parfois des choses étranges avec raw/urlencoding selon votre version: http: // www. faqs.org/rfcs/rfc3986.html – Jack

Questions connexes