Twitter API a través de OmniAuth en los carriles 3, Net :: HTTPUnauthorized demonios
-
15-10-2019 - |
Pregunta
Me siguió el OmniAuth sencillo tutorial ( http://asciicasts.com/episodes/241-simple -omniauth ), y puedo iniciar sesión con mi cuenta de twitter en el servicio. Ahora quiero acceder a la API de twitter y tweet de la aplicación. Mi código es el siguiente:
class TwitterController < ApplicationController
def prepare_access_token(oauth_token, oauth_token_secret)
consumer = OAuth::Consumer.new("KEY", "SECRET",
{
:site => "http://api.twitter.com"
})
# now create the access token object from passed values
token_hash =
{
:oauth_token => oauth_token,
:oauth_token_secret => oauth_token_secret
}
access_token = OAuth::AccessToken.from_hash(consumer, token_hash)
return access_token
end
def tweet
# Exchange our oauth_token and oauth_token secret for the AccessToken instance.
@access_token = prepare_access_token(current_user.token, current_user.secret)
@response = @access_token.request(:post, "http://api.twitter.com/1/statuses/update.json", :status => "Tweet pela API")
render :html => @response.body
end
end
La línea de render no hace nada. Por otra parte, si añado
<p><%= @response %></p>
a mi modo de ver, lo entiendo
#<Net::HTTPUnauthorized:0x2ac5149e94f0>
Sin embargo, yo soy capaz de obtener el nombre de usuario de la cuenta de twitter.
Mi modelo de usuario es la siguiente:
class User < ActiveRecord::Base
def self.create_with_omniauth(auth)
create! do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["user_info"]["name"]
user.token = auth['credentials']['token'],
user.secret = auth['credentials']['secret']
end
end
end
¿Qué estoy haciendo mal?
Solución
He descubierto el problema y ahora me siento bastante tonta. Hubo una coma en el modelo de usuario que no debería estar allí. El modelo debe ser
class User < ActiveRecord::Base
def self.create_with_omniauth(auth)
create! do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["user_info"]["name"]
user.token = auth['credentials']['token']
user.secret = auth['credentials']['secret']
end
end
end
Y ahora todo funciona bien.
Otros consejos
En lugar de codificar esto manualmente., Es posible que desee probar el uso de la gema de twitter (joya instalar twitter.) Obras para nosotros. La sintaxis es:
httpauth = Twitter::HTTPAuth.new(twitterName, twitterPass)
client = Twitter::Base.new(httpauth)
client.update(yourTweetText)