Ces derniers jours, je me suis cogné la tête contre le mur en soutenant la possibilité d'ajouter un contact à l'API Google Contacts dans mon application Rails 3. En dépit de nombreux faux départs, j'ai finalement fait quelques progrès en utilisant la gemme Ruby OAuth, et en suivant le tutoriel ici: http://everburning.com/news/google-analytics-oauth-and-ruby-oh-my/Ruby OAuth Nightmare: Utilisation de l'API Contacts
Lorsque je suis cela dans la console, je vais plus loin que dans mon application Rails. Je peux créer un jeton d'accès, m'authentifier auprès du service de Google avec la portée spécifique de l'API Contacts et appliquer le jeton oauth_verifier pour obtenir un jeton d'accès. Mais quand vient le temps de pousser les données, je reçois cette erreur:
response = at.post("https://www.google.com/m8/feeds/contacts/default/full", gdata)
=> #<Net::HTTPUnauthorized 401 Unknown authorization header readbody=true>
Où la « readbody = true » en-tête viennent, et comment pourrais-je me débarrasser?
Mais c'est pire dans l'application Rails. J'ai une action du contrôleur (« googlecontacts ») qui crée le jeton de demande et conduit l'utilisateur vers le site d'authentification avec Google:
def googlecontacts
@card = Card.find_by_short_link(params[:id])
@consumer = OAuth::Consumer.new(
'anonymous',
'anonymous',
{
:site => 'https://www.google.com',
:request_token_path => '/accounts/OAuthGetRequestToken',
:access_token_path => '/accounts/OAuthGetAccessToken',
:authorize_path => '/accounts/OAuthAuthorizeToken',
:signature_method => 'HMAC-SHA1',
:oauth_version => '1.0'
})
@request_token = @consumer.get_request_token(
{:oauth_callback => 'http://monkey.dev/cards/google_auth?redir='[email protected]_link},
{:scope => "https://www.google.com/m8/feeds/"}
)
session[:request_token] = @request_token
redirect_to @request_token.authorize_url
end
Cela semble fonctionner; Je reçois un objet de jeton de demande opérationnel et l'utilisateur est redirigé vers le service Google pour s'authentifier. L'URL de rappel ("google_auth") doit prendre le jeton oauth_verifier pour créer un jeton d'accès. Voici le début du contrôleur:
def google_auth
@access_token = session[:request_token].get_access_token(:oauth_verifier=>params[:oauth_verifier])
Et voici où ça craps. L'erreur sur cette dernière ligne est:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.[]
Mais les valeurs qui sont là - la session [:] request_token et les params [: oauth_verifier] - sont présents et pris en compte dans cette action! Je ne peux pas comprendre ce qui est nul ici.
Donc je suppose que je dois d'abord résoudre ce second problème, mais aussi des points bonus pour répondre au premier problème. :-)
Merci d'avoir lu.
Aaron.
Bah, je trouve le problème. J'utilisais du code d'un développeur précédent, et il avait caché une redéfinition de la méthode Marshal dans environment.rb. Retiré cela et tout a disparu. Les heures gaspillées! –
Juste une note: "readbody = true" n'est pas un en-tête. Cela fait partie de l'implémentation Ruby de l'objet réponse. Cela n'a jamais été envoyé par l'une ou l'autre des parties et cela n'a rien à voir avec le problème que vous aviez. –