2010-06-03 3 views
1

Je construis donc un script Java qui est utilisé conjointement avec mon application C++ pour envoyer des messages directs aux utilisateurs. le script fait le travail de construction de la requête que j'envoie. Quand j'envoie une demande, je reçois une «signature incorrecte» ou «ne peux pas m'authentifier» Est-ce que quelqu'un voit quelque chose qui me manque ou qui ne va pas? Je continue d'enquêter. Nous vous remercions à l'avanceTwitter OAuth, Erreur lors de la tentative de POST message direct

Javascript:

var nDate = new Date(); 
var epoch = nDate.getTime(); 
var nounce = ""; 

nounce = Base64.encode(epoch+randomString()); 

var Parameters = [ 
    "oauth_consumerkey="+sConsumerKey, 
    "oauth_nonce="+nounce, 
    "oauth_signature_method=HMAC-SHA1", 
    "oauth_timestamp="+epoch, 
    "oauth_token="+sAccessToken, 
    "oauth_version=1.0", 
    "text="+sText, 
    "user="+sUser]; 

var SortedParameters = Parameters.sort(); 
var joinParameters = SortedParameters.join("&"); 
var encodeParameters = escape(joinParameters); 



signature_base_string = escape("POST&"+NormalizedURL+"&"+encodeParameters); 

signature_key = sConsumerSecret+"&"+sAccessSecret; 

signature = Base64.encode(hmacsha1(signature_base_string,signature_key)); 


sAuthHeader = " 
    OAuth realm=, 
    oauth_nonce="+nounce+", 
    oauth_timestamp="+epoch+",  
    oauth_consumer_key="+sConsumerKey+", 
    oauth_signature_method=HMAC-SHA1, 
    oauth_version=1.0, 
    oauth_signature="+signature+", 
    oauth_token="+sAccessToken+", 
    text="+sText; 

goNVOut.Set("Header.Authorization: ", sAuthHeader); 
+1

Une chose à vérifier est de s'assurer que l'heure de votre serveur est synchronisée avec celle de Twitter. Si cela dépasse 5 minutes, vos demandes échoueront. – abraham

+0

comment puis-je avoir l'heure de Twitter? – Darxval

+0

Je l'ai lentement obtenu, ce n'est pas complètement le travail mais, quand vous appelez les scripts Java, prenez le temps de gagner du temps en millisecondes. merci Abraham! – Darxval

Répondre

2

Voici deux choses à faire attention sur:

  • fonction "évasion" de JavaScript ne fonctionnera pas pour l'encodage URL OAuth, selon le OAuth Spec .

5.1. Encodage des paramètres

Tous les noms de paramètres et les valeurs sont échappés en utilisant le mécanisme de codage en pourcentage (% xx) [RFC3986] . Caractères ne figurant pas dans le jeu de caractères non réservé ([RFC3986] section 2.3) DOIT être codé. Les caractères du jeu de caractères non réservé NE DOIVENT PAS être codés . Les caractères hexadécimaux dans les codages DOIVENT être en majuscules. Le texte les noms et les valeurs DOIT être codé comme UTF-8 octets avant le codage de pourcentage eux selon [RFC3629].

 unreserved = ALPHA, DIGIT, '-', '.', '_', '~' 

fonction d'échappement de JavaScript laissera @ +/par, non échappés. Je suis confiant que cela va briser le processus de signature de signature, puisque le serveur échappera à ceux-ci, et la valeur HMAC-SHA1 qu'il calcule sera différente de la vôtre. Assurez-vous de coder votre URL URI de base, NormalizedURL, également. J'ai trouvé que l'encodage correct est la partie la plus fastidieuse d'OAuth. Veillez à utiliser des majuscules dans votre nouvelle fonction "url_encode".

Voici mon code C++ pour faire le codage de l'URL. Il pourrait être optimisé un peu mais devrait être facile à comprendre.

char hexdigit(int ch) 
{ 
    assert(ch < 16); 
    assert(ch >= 0); 
    if (ch >= 10) 
     return 'A' + ch - 10; 
    return '0' + ch; 
} 

std::string url_encode(const std::string &to_encode) 
{ 
    std::stringstream ss; 
    for (std::string::const_iterator ich = to_encode.begin(); 
     ich != to_encode.end(); 
     ++ich) 
    { 
     unsigned char ch = (unsigned char)*ich; 
     if (isalpha(ch) || isdigit(ch) || ch == '-' || ch == '_' || ch == '.' || ch == '~') 
     { 
      ss << ch; 
     } 
     else 
     { 
      ss << '%'; 
      ss << hexdigit(ch >> 4); 
      ss << hexdigit(ch & 0xf); 
     } 
    } 

    std::string encoded = ss.str(); 
    return encoded; 
} 

Bonne chance!

+0

Merci Will, l'encodage me posait aussi des problèmes. maintenant je suis en train de débugger lentement jusqu'à ce que le format est ce qui doit être pour Twitter. Merci les gars!!! – Darxval

+0

Si vous ne voulez pas faire quelque chose juste faire cela http://twitter.com/intent/tweet?text=message – GameLoading