2010-03-11 7 views
1

J'essaye de faire en sorte que Rails joue bien avec OAuth de l'API Digg. J'utilise la gemme d'oauth (celle de ruby, pas celle de rails).OAuth avec Digg API

Mon code ressemble à peu près comme ceci:

@consumer = OAuth::Consumer.new(API_KEY, API_SECRET, 
    :scheme => :header, 
    :http_method => :post, 
    :oauth_callback => "http://locahost:3000", 
    :request_token_url => 'http://services.digg.com/1.0/endpoint?method=oauth.getRequestToken', 
    :access_token_url => 'http://services.digg.com/1.0/endpoint?method=oauth.getAccessToken', 
    :authorize_url => 'http://digg.com/oauth/authorize') 
    @request_token = DiggController.consumer.get_request_token({ 
     :oauth_callback => "http://xx.xxx.xxx.x:3000/digg/callback" 
    }, { 
     'Content-Type' => 'application/x-www-form-urlencoded' 
    }) 
session[:request_token] = @request_token.token 
session[:request_token_secret] = @request_token.secret 
redirect_to @request_token.authorize_url 

Ce qui est par le livre en termes de ce que la documentation gem m'a donné. Cependant, Digg me renvoie une erreur "400 Bad Request" lorsque @ consumer.get_request_token est appelé. Je ne peux pas comprendre ce que je fais mal. Des idées?


Modifier: Code mis à jour et sortie Wireshark ajoutée. Mon erreur est maintenant "401 Autorisation requise".

sortie de Wireshark:

POST /1.0/endpoint?method=oauth.getRequestToken HTTP/1.1 
Accept: */* 
Connection: close 
User-Agent: OAuth gem v0.3.6 
Content-Type: application/x-www-form-urlencoded 
Authorization: OAuth oauth_nonce="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
    oauth_callback="http%3A%2F%2Fxx.xxx.xxx.x%3A3000%2Fdigg%2Fcallback", 
    oauth_signature_method="HMAC-SHA1", 
    oauth_timestamp="1268687137", 
    oauth_consumer_key="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
    oauth_signature="xxx%2Bxxxxxxxxxxxxxxx%2Fxxxxxxx%3D", oauth_version="1.0" 
Content-Length: 48 
Host: services.digg.com 

Content-Type=application%2fx-www-form-urlencoded 



HTTP/1.1 401 Authorization Required 
Date: Mon, 15 Mar 2010 21:05:37 GMT 
Server: Apache 
X-Powered-By: PHP/5.2.9-digg8 
Cache-control: private 
X-RateLimit-Current: 1 
X-RateLimit-Max: 1000 
X-RateLimit-Reset: 3600 
X-Digg-Api-Version: 1.0 
Accept-Ranges: bytes 
Content-Length: 111 
Keep-Alive: timeout=5, max=9998 
Connection: Keep-Alive 
Content-Type: text/xml;charset=utf-8 

<?xml version="1.0" encoding="UTF-8"?> 
<error code="5001" message="Invalid 
signature" timestamp="1268687137"/> 

Répondre

1

Soit dit en passant, le paramètre de rappel ne doit pas être localhost:3000 mais votre adresse IP publique (en vous assurant d'aussi ouvrir le port 3000 pour les connexions externes dans votre ordinateur et/ou pare-feu du routeur (s)), ou être laissée à la valeur par défaut (. out-of-band)

Examiner le contenu de l'exception OAuth::Unauthorized qui est jeté (ou utiliser un sniffer, comme tcpdump ou Wireshark) pour obtenir des détails supplémentaires au sujet de la Erreur HTTP 400 (ils ont probablement des problèmes avec certains de vos paramètres.)

+0

Merci pour le conseil, mais je n'arrive même pas à la page d'autorisation Digg. Le seul paramètre qui semble importer en ce moment est request_token_url. – Karl

+1

Utilisez tcpdump ou Wireshark pour voir ce que digg vous répond dans le corps du HTTP 400. Incidemment, http://community.freshbooks.com/forums/viewtopic.php?pid=26769 est-il utile? – vladr

+0

J'utilise localhost: 3000 comme callback dans la connexion Oauth à Twitter et MyspaceID. Donc, ne peut pas bloquer – shingara