Obtenir un jeton d'accès OAuth (non spécifique de la langue) - même problème pour Flickr et Tumblr, mais pas Twitter

StackOverflow https://stackoverflow.com/questions/8373885

Question

Je fais l'erreur énorme d'écrire ma propre bibliothèque OAuth et les classes wrapper en PHP. Tout fonctionne à merveille pour la mise en œuvre de OAuth de Twitter, mais je ne la signature de l'étape de access_token pour les deux Tumblr et Flickr.

La seule différence dans cette étape, est maintenant, j'ai paramètres oauth_token oauth_verifier. J'utilise l'en-tête d'autorisation, et le seul problème que je peux penser est qu'il ya un certain codage de caractères questions, mais je ne suis pas sûr.

string base (cassé pour plus de clarté):

POST&
http%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Faccess_token&
oauth_consumer_key%3Deeedfcd4c46a2c12080f58eb90a974d8
%26oauth_nonce%3D322190b47ca680d053338724ad1cc56d35d3e7b5
%26oauth_signature_method%3DHMAC-SHA1
%26oauth_timestamp%3D1322981994
%26oauth_token%3D72157628270097303-18aa378b4ab02af3
%26oauth_verifier%3Dec7811503fdd4380
%26oauth_version%3D1.0

Ceci est exactement ce que Flickr attend (ils me le disent dans la réponse d'erreur), ce qui me porte à croire que la signature est le problème.

en-tête d'autorisation (également rompu par souci de clarté):

Authorization: OAuth
oauth_consumer_key="eeedfcd4c46a2c12080f58eb90a974d8", 
oauth_nonce="322190b47ca680d053338724ad1cc56d35d3e7b5",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1322981994",
oauth_token="72157628270097303-18aa378b4ab02af3",
oauth_verifier="ec7811503fdd4380",
oauth_version="1.0",
oauth_signature="LYJtgHetQWNKX3rtQlSs643FdWY%3D"

Réponse Flickr :

oauth_problem=signature_invalid&
debug_sbs=POST&
    http%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Faccess_token&
    oauth_consumer_key%3Deeedfcd4c46a2c12080f58eb90a974d8
    %26oauth_nonce%3D322190b47ca680d053338724ad1cc56d35d3e7b5
    %26oauth_signature_method%3DHMAC-SHA1
    %26oauth_timestamp%3D1322981994
    %26oauth_token%3D72157628270097303-18aa378b4ab02af3
    %26oauth_verifier%3Dec7811503fdd4380
    %26oauth_version%3D1.0

Il n'y a pas GET ou POST paramètres. Tout semble être correctement échappé de ce que je vois ici. La signature fonctionne pour l'étape de request_token (et Twitter, pour toute demande). Je l'ai vérifié que mon horloge du serveur se trouve dans une seconde de la leur. Est-ce que je manque quelque chose évidente? Comment feriez-vous pour diagnostiquer cela?

Était-ce utile?

La solution

Je vais répondre à ma propre question.

Il y avait quelques divergences entre les différentes implémentations de fournisseur de services oauth:

Twitter

  • oauth_callback à l'étape Se attend request_token
  • ne renvoie pas oauth_token_secret jusqu'à ce que la réponse access_token
  • Par conséquent, il y a un oauth_token_secret vide en signant la demande access_token

Flickr et Tumblr

  • oauth_callback attendre à l'étape authenticate (c.-à-authorize)
  • Retour oauth_token_secret à l'étape request_token (et vous vous attendez à retenir et l'utiliser pour signer la demande access_token)

Youtube (et d'autres fournisseurs de services Google OAuth):

  • Google-propriétaire attend la "portée" à l'étape request_token
  • attend oauth_callback sur authenticate (à savoir OAuthAuthorizeToken) étape
  • ne semble pas comme oauth_token passé en-tête d'autorisation à l'étape (access_token répond par « invalide jeton » en raison de double codage nécessaire dans la chaîne de base). Passez dans le corps de la poste ou la chaîne de requête à la place.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top