使用 oauth 和 twitter ruby​​ gem 时不断收到 OAuth::Unauthorized 错误

Posted

技术标签:

【中文标题】使用 oauth 和 twitter ruby​​ gem 时不断收到 OAuth::Unauthorized 错误【英文标题】:Keep getting OAuth::Unauthorized error when using oauth and twitter ruby gems 【发布时间】:2010-11-19 19:11:52 【问题描述】:

我正在使用 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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

你能解释一下你是如何做到这一点的吗?您是否将其与 OP 标记的宝石一起设置?还是您使用了不同的方法?【参考方案2】:

我也遇到了同样的问题,这个帖子中的任何建议都不适合我。

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

【讨论】:

很高兴你离开了这个解决方案。时钟关闭的 MacBook Air 也有同样的问题。我可能会在错误的兔子洞中浪费很多时间——非常感谢肯尼!【参考方案3】:

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

应用程序类型:浏览器 回调地址:http://127.0.0.1:3000/auth/twitter/callback

【讨论】:

感谢这对我有用 回调 URL:127.0.0.1:3000/auth/twitter/callback 请注意,您需要使用 127.0.0.1 格式,因为 Twitter 不接受 localhost。 这对我有用***.com/questions/8263675/…【参考方案4】:

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

改为使用http://127.0.0.1:3000/auth/twitter/callback

希望对你有帮助

【讨论】:

【参考方案5】:

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

【讨论】:

如果您的服务器时间已经过时(例如,虚拟机时钟已经走到日落),那么您将收到“Twitter OAuth 401 Unauthorized”错误(例如,如果您使用的是 OAuth gem )。更改时间确实可以解决此问题。 非常感谢!这变得相当痛苦。我检查了一下,我的虚拟机没有设置为与 VMWare Fusion 中的主机同步时间。检查高级设置中的同步时间选项,它立即开始工作。【参考方案6】:

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

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

【讨论】:

我做了同样的事情。感谢您发布 +1 桌面应用程序和 Web 应用程序之间的实际区别是什么? @Radek - 桌面和网页本质上是一样的。但是,桌面应用程序不能将回调 URL 作为授权过程的一部分。相反,twitter 会生成一个 PIN 码,然后将其显示给用户并将其输入到桌面应用程序中。 @Dan Diplo:谢谢你的解释。仍然想知道回调 URL 是如何工作的。是不是一直都是同一个url,所有信息都只存储在header中? 令我失望的是:虽然您可以在请求中覆盖回调 URL,但如果您在 twitter 上注册应用程序时没有输入 ~something~ 作为回调 url,那么 twitter 会将您的设置默认为“客户端应用程序”。除非您返回重新编辑设置,否则您不会注意到这一点。【参考方案7】:

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

【讨论】:

您能详细说明一下吗?重定向中的多个请求?或图像/静态文件,但在同一个请求中? 已经有一段时间了,但我认为如果你有一个带有空源 (src="") 或者我有 (src="/") 的 img 标签,你的浏览器会尝试为图像再次加载您的网站。因此,对于每个具有空源的图像,您都会获得额外的负载 谢谢托尼。救生员。你知道为什么这会导致 oauth 失败吗? 老实说,我已经记不清原因了。很高兴这有帮助。【参考方案8】:

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

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

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

【讨论】:

我将回调 URL 添加到示例中。我知道人们现在正在成功地使用 Twitter gem,但是使用 oauth 0.3.4(0.3.5 破坏了一些东西)。至于正确的令牌和秘密,我直接从我的推特应用程序设置中复制了消费者密钥和秘密……不知道这些是怎么回事。请求令牌和秘密生成一次并保存在会话中,因此它们不会更改,我也不确定它们是如何出错的。 “正确的回调 URL”是什么意思?我肯定会在我的网络应用程序中被重定向到正确的操作...这不意味着它是正确的吗?

以上是关于使用 oauth 和 twitter ruby​​ gem 时不断收到 OAuth::Unauthorized 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用omniauth-twitter的Ruby on Rails应用程序在heroku上不起作用“很抱歉,出了点问题。”

使用 oauth 和 twitter4j 集成 Android Twitter

使用 Twitter 搜索 API 的位置和 OAuth 问题

Twitter\OAuth2\Python 入门

通过 ServiceStack api 使用 Linq2Twitter 和缓存的 OAuth 令牌

Twitter OAuth API 超时(Nginx 还是 Twitter?)