使用oauth和twitter ruby​​ gems时,请继续获取OAuth :: Unauthorized错误

时间:2009-08-14 21:23:05

标签: ruby-on-rails ruby twitter oauth

我正在使用ruby twitter gem和oauth来访问用户的Twitter帐户。在我的代码中,我有:

unless @user.twitter_authd?
      oauth = Twitter::OAuth.new('token', 'secret')
      session[:twitter_request_token] = oauth.request_token.token
      session[:twitter_request_secret] = oauth.request_token.secret
      @twitter_auth_url = oauth.request_token.authorize_url
    end

其中令牌和秘密已插入我的实际令牌和密码。当我点击@twitter_auth_url的链接时,我被带到twitter并要求授予访问权限。我点击允许,然后Twitter将我重定向到我的回调网址http://www.mydomain.com/twitter_callback/?oauth_token=fmy2aMvnjVgaFrz37bJ4JuB8r5xN79gsgDQRG4BNY,然后点击此代码:

oauth = Twitter::OAuth.new('token', 'secret')

    logger.info("session[:twitter_request_token] = #{session[:twitter_request_token]}")
    logger.info("session[:twitter_request_secret] = #{session[:twitter_request_secret]}")

    oauth.authorize_from_request(session[:twitter_request_token], session[:twitter_request_secret])
    session[:twitter_request_token] = nil
    session[:twitter_request_secret] = nil

    @user.update_attributes({
      :twitter_token => oauth.access_token.token, 
      :twitter_secret => oauth.access_token.secret,
    })

    redirect_to root_path

Twitter请求令牌和秘密设置得很好。但是我最终得到了授权错误:

 OAuth::Unauthorized in MainController#twitter_callback

401 Unauthorized

RAILS_ROOT: /Users/TAmoyal/Desktop/RoR_Projects/mls
Application Trace | Framework Trace | Full Trace

/Library/Ruby/Gems/1.8/gems/oauth-0.3.4/lib/oauth/consumer.rb:167:in `token_request'
/Library/Ruby/Gems/1.8/gems/oauth-0.3.4/lib/oauth/tokens/request_token.rb:14:in `get_access_token'
/Library/Ruby/Gems/1.8/gems/erwaller-twitter-0.6.13.1/lib/twitter/oauth.rb:29:in `authorize_from_request'
/Users/TAmoyal/Desktop/RoR_Projects/mls/app/controllers/main_controller.rb:70:in `twitter_callback'

代码在此行失败:

oauth.authorize_from_request(session[:twitter_request_token], session[:twitter_request_secret])

当它试图获取访问令牌时。您可以看到authorize_from_request here的源代码。我不确定为什么会这样。有人有想法吗?

8 个答案:

答案 0 :(得分:78)

派对有点晚了,但我自己遇到了同样的问题。我将问题跟踪到Twitter中我的OAuth应用程序的设置。我最初没有指定回调网址,因为我不确定它。

一旦我设置了rails应用程序,我就回去发现Twitter假设我是桌面应用程序,因为我没有指定回调URL。一旦我将其更改为网站并输入回调网址,我就停止了400次。

答案 1 :(得分:28)

如果您收到错误401 - OAuth :: Unauthorized,请确保按如下方式编辑Twitter应用程序的设置:

答案 2 :(得分:8)

这是关于系统与Twitter服务器的时间同步问题。

答案 3 :(得分:7)

Twitter不允许localhost作为有效回调网址的一部分。

而是使用http://127.0.0.1:3000/auth/twitter/callback

希望这有帮助

答案 4 :(得分:4)

这是我遇到的最烦人的调试之一。我偶然输出几个地方,因为URL是动态的,它们碰巧没有在我的测试用例中定义(我使用它来显示图表数据,现在还不够,所以google chart api URL是空白的)。这导致我的浏览器在加载某些页面时向我的localhost发出多个请求。某种程度上,这使得oauth过程失败了。显然,S.O.上的人没有办法。了解我的应用程序特定问题,所以我不得不回答我自己的问题。

答案 5 :(得分:2)

我遇到了同样的问题,这个帖子中没有任何建议对我有效。

我发现我的问题是我的请求中的TIMESTAMP。我运行脚本的移动设备有一个升级的时钟。当我将设备上的系统时间更新到正确的时间(即现在)时,我的所有请求都返回“200 OK”而不是“401 Unauthorized”。

答案 6 :(得分:1)

这个问题似乎是因为Twitter无法正确处理connection keep-alive。确保在twitter的请求中设置connection=close http header。浪费了周末调试这个。

答案 7 :(得分:0)

对我来说信息不够,但是什么时候twitter gem最后更新? twitter在大约中期改变了他们的oauth'东西'。也许你有一个旧的。我会更新你的问题以显示callback_url,并确保你有正确的令牌和秘密,它看起来你没有。

另外,您是否在Twitter应用页面中放置了正确的回调网址?很多时候也搞砸了你。

如果失败则使用mbleigh twitter_auth代替。它适合我,非常漂亮。