【问题标题】:How do I authenticate users in a Rails app with the oauth gem and twitter 1.0.0 gem?如何使用 oauth gem 和 twitter 1.0.0 gem 对 Rails 应用程序中的用户进行身份验证?
【发布时间】:2011-05-14 19:35:40
【问题描述】:

Jnunemaker 刚刚更新了他的 twitter gem (https://github.com/jnunemaker/twitter) 并删除了 Twitter::Oauth 类。我的代码看起来不太像他的示例,所以我在更新它时遇到了问题。这是我的代码在 twitter 0.9 gem 上的显示:

用户控制器

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

这是我尝试更改此代码的示例:

用户控制器

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

宝石文件

...
gem 'oauth'

我确定我的回调方法有很多问题,但奇怪的是,我的 oauth 方法在本地运行时工作正常,但在我运行时却给我一个“502 Bad Gateway”错误从我的 live(使用 heroku 部署)版本尝试。

【问题讨论】:

  • 您是否使用代理(即 Heroku 的 Apigee 插件)?
  • 不。我使用 heroku gem github.com/heroku/heroku
  • 可以直接使用access_token来发出请求吗?即 access_token.request(:get, "api.twitter.com/1/statuses/home_timeline.json")
  • 您是否在 routes.rb 中定义了您的 '/auth/:provider/callback' 路由?听起来您获得了正确的重定向。退出您的 Twitter 帐户,然后尝试转到 /auth/twitter。然后它应该将您发送到 Twitter。这是设置 OmniAuth 的另一个示例 arailsdemo.com/posts/19

标签: ruby-on-rails twitter oauth twitter-gem


【解决方案1】:

如果您现在无法使用它,我可以将 Omniauth gem 与 Twitter gem 一起使用。 Omniauth is very easy to setup.

要使用 Twitter gem,只需在 Omniauth 回调完成后获取访问令牌信息:

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

然后在使用 Twitter gem 方法之前设置 Twitter gem 配置设置

Twitter.oauth_token = token
Twitter.oauth_token_secret = secret

Twitter.home_timeline.first.text

(如果您还没有在初始化文件中设置 Twitter gem consumer_key 和 consumer_key_secret...)

【讨论】:

  • 嗯,我正在尝试,但它仍然无法正常工作 - 出于某种原因,在我转到 myapp/auth/twitter 后,它会重定向到 myapp/auth/twitter/callback?oauth_token=xxxx&oauth_verifier=xxxx。我认为这应该发生在 twitter api 网站上。知道为什么会发生这种情况吗?
  • 在我的 Twitter 应用程序的设置页面上,在 OAuth 1.0a 设置下,它说:OAuth 1.0a 集成需要更多工作。这可能与它有关吗?
【解决方案2】:

我运气不错

Authlogic + AuthLogic 连接。

我不确定您是否需要手动实现 oauth,但 gem 可能值得研究。

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

我发现 oauth 提供程序的唯一问题是,如果无法识别回调 url,它们有时会提供糟糕的错误消息,这是在您获取 api 密钥的位置配置的。

-肯

【讨论】:

    【解决方案3】:

    你的例子很接近。控制器操作的正确代码应该是这样的:

      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
    

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多