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

Ton*_*ony 40 ruby twitter ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

其中令牌和秘密已插入我的实际令牌和秘密.当我点击@twitter_auth_url的链接时,我被带到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
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

代码在此行失败:

oauth.authorize_from_request(session[:twitter_request_token], session[:twitter_request_secret])
Run Code Online (Sandbox Code Playgroud)

当它试图获得访问令牌时.您可以在此处查看authorize_from_request的源代码.我不确定为什么会这样.有人有想法吗?

小智 78

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

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

  • 是什么让我失望:虽然你可以覆盖请求中的回调URL,如果在twitter上注册应用程序时没有输入〜something~作为回调网址,那么twitter会将你的设置默认为"客户端应用程序".除非您重新编辑设置,否则您不会注意到这一点. (2认同)

小智 28

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

  • 请注意,您需要使用127.0.0.1格式,因为Twitter不接受localhost. (3认同)

小智 8

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

  • 如果您的服务器时间已经结束(例如虚拟机时钟已经徘徊到日落),那么您将收到"Twitter OAuth 401 Unauthorized"错误(例如,如果您正在使用OAuth gem).更改时间可以解决此问题. (2认同)

Tha*_*you 7

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

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

希望这可以帮助


Ton*_*ony 4

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