41

我正在使用 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 将我重定向到我的回调 URL 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

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

 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 的源代码。我不确定为什么会这样。有人有想法吗?

4

8 回答 8

78

聚会有点晚了,但我自己也遇到了同样的问题。我将问题追溯到在 Twitter 中设置我的 OAuth 应用程序。我最初没有指定回调 URL,因为我不确定。

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

于 2010-01-03T10:37:07.417 回答
30

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

于 2011-03-10T15:21:22.257 回答
8

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

于 2010-10-05T10:54:55.163 回答
7

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

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

希望这可以帮助

于 2011-03-08T21:47:51.977 回答
4

这是我遇到的最烦人的调试问题之一。我偶然在几个地方输出,因为 URL 是动态的,而且它们碰巧没有在我的测试用例中定义(我用它来显示图表数据,现在还不够,所以谷歌图表 api URL 是空白的)。这导致我的浏览器在加载某些页面时向我的本地主机发出多个请求。不知何故,这使得 oauth 过程变得一团糟。显然,SO 上的人无法了解我的应用程序特定问题,所以我不得不回答我自己的问题。

于 2009-08-18T00:35:53.667 回答
2

我遇到了同样的问题,并且该线程中的任何建议都不适合我。

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

于 2012-01-16T23:53:41.577 回答
1

这个问题似乎是由于 twitter 无法connection keep-alive正确处理造成的。确保您connection=close http header在对 twitter 的请求中进行了设置。浪费了一个周末调试这个。

于 2011-03-21T19:26:49.647 回答
0

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

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

如果失败,请改用 mbleighs twitter_auth。它对我有用,而且非常漂亮。

于 2009-08-15T01:32:06.550 回答