Как аутентифицировать пользователей в приложении Rails с помощью гема oauth и твиттера 1.0.0? - PullRequest
3 голосов
/ 24 ноября 2010

Jnunemaker только что обновил свой драгоценный камень twitter (https://github.com/jnunemaker/twitter) и удалил класс Twitter :: Oauth. Мой код не очень похож на его пример, поэтому у меня возникают проблемы при его обновлении. Вот как мой код использовал для просмотра твиттер 0,9 самоцвета:

UsersController

def oauth
  consumer = Twitter::OAuth.new('mykey','mysecret')
  request_token = consumer.request_token  
  session[:request_token] = request_token.token  
  session[:request_token_secret] = request_token.secret
  redirect_to 'http://api.twitter.com/oauth/authorize?oauth_token='+request_token.token
end

def callback
  consumer = Twitter::OAuth.new('mykey','mysecret')
  atoken, asecret = oauth.authorize_from_request(session[:request_token], session[:request_token_secret], params[:oauth_verifier])  
  consumer.authorize_from_access(atoken,asecret)
  user = Twitter::Base.new(consumer).verify_credentials

  #and then I create a new user in my application, with attributes such as the user's follower count, etc
end

Вот пример того, что я пытался сделать, чтобы изменить этот код:

UsersController

def oauth
  consumer = OAuth::Consumer.new("mykey", "mysecret", :site => "siteurl")
  request_token = consumer.get_request_token
  session[:request_token] = request_token.token  
  session[:request_token_secret] = request_token.secret
  redirect_to 'http://api.twitter.com/oauth/authorize?oauth_token='+request_token.token
end

def callback
  consumer = OAuth::Consumer.new("mykey", "mysecret", :site => "siteurl")
  request_token = session[:request_token]
  atoken = OAuth::RequestToken.new(consumer, request_token.token, request_token.secret).get_access_token(:oauth_verifier => params[:oauth_verifier])
  consumer.authorize_from_access(atoken)
  user = Twitter::Client.new(consumer).verify_credentials

Gemfile

...
gem 'oauth'

Я уверен, что в моем методе обратного вызова есть ряд неправильных вещей, но одна странная вещь заключается в том, что мой метод oauth работает нормально, когда я работаю локально, но выдает ошибку «502 Bad Gateway», когда я попробуй из моей живой (развернутой с герою) версии.

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Если вы не можете заставить его работать с тем, что у вас есть сейчас, я смог бы использовать драгоценный камень Omniauth вместе с драгоценным камнем Twitter. Omniauth очень прост в настройке.

Чтобы использовать гем Twitter, просто получите информацию о токене доступа после выполнения обратного вызова Omniauth:

token = omniauth['credentials']['token'], 
secret = omniauth['credentials']['secret']

Затем просто установитенастройки конфигурации драгоценного камня Twitter перед использованием методов драгоценного камня Twitter

Twitter.oauth_token = token
Twitter.oauth_token_secret = secret

Twitter.home_timeline.first.text

(Вам нужно будет настроить драгоценные камни Twitter_key и потребитель__секреты, если вы еще этого не настроили в файле инициализатора...)

0 голосов
/ 27 января 2015

Вы были близки в вашем примере. Правильный код для вашего действия контроллера будет примерно таким:

  def new
    consumer = OAuth::Consumer.new(YOUR_CONSUMER_TOKEN, YOUR_CONSUMER_SECRET, site: 'https://api.twitter.com', request_endpoint: 'https://api.twitter.com', authorize_path: '/oauth/authenticate')

    unless params[:oauth_token]
      request_token = consumer.get_request_token({ oauth_callback: request.original_url })
      session[:request_token] = { token: request_token.token, secret: request_token.secret}
      redirect_to request_token.authorize_url(force_login: 'true')
    else
      request_token = OAuth::RequestToken.from_hash(consumer, oauth_token: session[:request_token]["token"], oauth_token_secret: session[:request_token]["secret"])
      access_token = request_token.get_access_token(oauth_verifier: params[:oauth_verifier])
      session[:request_token] = nil

      @client = Twitter::REST::Client.new do |config|
        config.consumer_key        = YOUR_CONSUMER_TOKEN
        config.consumer_secret     = YOUR_CONSUMER_SECRET
        config.access_token        = access_token.token
        config.access_token_secret = access_token.secret
      end
    end
  end
0 голосов
/ 24 ноября 2010

Мне повезло с

Authlogic + AuthLogic Connect.

Я не уверен, если вам нужно реализовать oauth вручную, но драгоценный камень, возможно, стоит изучить.

https://github.com/viatropos/authlogic-connect

Единственная ошибка, которую я обнаружил у провайдеров oauth, - иногда они выдают плохие сообщения об ошибках, если URL-адрес обратного вызова не распознается, что настраивается там, где вы получаете API.ключи.

-Ken

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...