【问题标题】:Ruby on Rails OAuth application works on client but not on server (OAuth::Unauthorized (401 Unauthorized))Ruby on Rails OAuth 应用程序可在客户端上运行,但不能在服务器上运行(OAuth::Unauthorized (401 Unauthorized))
【发布时间】:2011-04-21 14:34:31
【问题描述】:

我有一个 Ruby on Rails 应用程序,它在我的计算机和服务器上运行良好。我正在将此应用程序移动到在另一个托管服务上运行的另一个服务器上,并且遇到了与 OAuth Ruby Gem 相关的问题。

我使用 OAuth gem 进行的任何请求都会得到:

OAuth::Unauthorized (401 Unauthorized):
  oauth (0.4.3) lib/oauth/consumer.rb:217:in `token_request'
  oauth (0.4.3) lib/oauth/consumer.rb:139:in `get_request_token'
  ...

我的代码是:

def self.consumer
  # The readkey and readsecret below are the values you get during registration
  OAuth::Consumer.new("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "YYYYYYYYYYYYYYYYYYYYYYYYYYYY", {:site => "http://api.twitter.com"})
end

def create_authorize_url
  @request_token = UserController.consumer.get_request_token(:oauth_callback => "http://mysite.com/callback")
  session[:request_token] = @request_token.token
  session[:request_token_secret] = @request_token.secret

  redirect_to @request_token.authorize_url
end

问题是相同的代码在我的计算机和其他服务器上运行良好。这只发生在一台服务器上。有什么与防火墙相关的东西或可以阻止 OAuth 调用的东西吗?

我搜索了很多这个错误,但没有得到任何答案,这就是我在这里问这个的原因。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我发现我的 Twitter Consumer Key 和 Secret 在 config/application.yml 中,并且该文件在 .gitignore 中列出,因为它没有被推送到 Heroku。结果,这个 401 错误从 Twitter OAuth 中出现,因为应用程序的凭据丢失。解决方案是在 .gitignore 文件中找到提及包含您的 Twitter(或其他 OAuth 提供者)应用程序凭据的任何配置文件的行。从 .gitignore 中删除该行后,执行

    git add .
    git commit -m "Added back configuration files for OAuth provider"
    

    如果你在 heroku 上,你可以这样做

    git push heroku master
    

    希望这应该可行。

    【讨论】:

      【解决方案2】:

      很可能您正在尝试的服务器环境正在使用某种反向代理设置,其中 OAuth 服务器具有内部地址和端口,而您的 OAuth 客户端只会看到外部可路由地址。

      这将导致客户端和服务器上的签名基础字符串不同,因此在验证期间会给您一个授权错误!

      我们在设置中遇到过类似的问题,在开发环境中一切正常,但在我们的网络设置(DMZ 等)非常不同的生产环境中失败。

      当我们使用 Nginx 时,解决方案是使用 proxy_set_header 指令将外部主机传递给内部应用程序服务器:

        server {
           # The external IP
           listen x.x.x.x; 
           ...
           location /api {
              # Internal app server
              proxy_pass http://192.168.1.100:4000;
      
              # Pass the external IP to the app server
              proxy_set_header Host $host; 
           }
           ....
        }
      

      但也要先检查你的服务器时钟,NTP 是你的朋友。

      【讨论】:

        【解决方案3】:

        我的猜测是存在时间偏差。尝试使用 ntpdate 同步时钟(通常使用 ntp 也是一个好主意)。

        【讨论】:

          【解决方案4】:

          尝试挽救OAuth::Unauthorized 异常并检查其包装的响应。比如:

          def create_authorize_url
            @request_token = UserController.consumer.get_request_token(:oauth_callback => "http://mysite.com/callback")
            session[:request_token] = @request_token.token
            session[:request_token_secret] = @request_token.secret
          
            redirect_to @request_token.authorize_url
          rescue OAuth::Unauthorized => e
            logger.error e.response.inspect
          end
          

          OAuth 提供商可能会在他们发送给您的 401 响应中添加其他信息。请求令牌请求上的 401 对我来说似乎有点奇怪,但 oauth spec does talk about it some

          我怀疑您要使用的托管服务可能由于不良行为而被提供商阻止。在这种情况下,您需要与他们讨论。

          但是,如果没有更多信息,我们无法真正知道原因。

          【讨论】:

          • 来自 Twitter 的 API 的响应是“无法验证 oauth 签名和令牌”。问题似乎出在 HTTP 请求的生成中。任何想法,人们?谢谢。
          • 你看过这个帖子吗:blainegarrett.com/2009/07/14/…tl;dr 如果你的时钟与 Twitter 的时钟相差太远,你的签名就会出错。
          【解决方案5】:

          好的,这是工作服务器 gems 和 Ruby 版本。

          宝石:

          root@phcf:/www/rails# gem list
          
          *** LOCAL GEMS ***
          
          aaronp-frex (1.0.1)
          actionmailer (2.3.8, 2.3.5)
          actionpack (2.3.8, 2.3.5)
          activerecord (2.3.8, 2.3.5)
          activeresource (2.3.8, 2.3.5)
          activesupport (2.3.8, 2.3.5)
          addressable (2.2.1)
          chronic (0.2.3)
          configuration (1.1.0)
          daemons (1.0.10)
          eventmachine (0.12.10)
          facebook_oauth (0.2.0)
          faraday (0.4.6)
          fastthread (1.0.7)
          gemcutter (0.5.0)
          gruff (0.3.6)
          heroku (1.10.8, 1.9.13)
          highline (1.5.2)
          hoe (2.5.0)
          hpricot (0.8.2)
          json (1.2.2)
          json_pure (1.2.3)
          launchy (0.3.7)
          mime-types (1.16)
          multi_json (0.0.4)
          mysql (2.8.1)
          net-sftp (2.0.4)
          net-ssh (2.0.23)
          nokogiri (1.4.1)
          oauth (0.4.3)
          oauth2 (0.0.13)
          passenger (2.2.9)
          pastiepacker (1.1.1)
          rack (1.1.0, 1.0.1)
          rails (2.3.8, 2.3.5)
          rake (0.8.7)
          rest-client (1.4.2)
          rmagick (2.12.2)
          rubyforge (2.0.4)
          rubygems-update (1.3.5)
          shared-mime-info (0.1)
          steam-condenser (0.10.0, 0.9.0)
          thin (1.2.5)
          tmail (1.2.7.1)
          twitter_oauth (0.4.3)
          unicorn (0.96.1)
          xmpp4r (0.5)
          xmpp4r-simple (0.8.8)
          

          Ruby 版本:

          root@phcf:/www/rails# ruby -v
          ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
          

          【讨论】:

            【解决方案6】:

            对不起。服务器上安装的gem:

            root@server1:~# gem list
            
            *** LOCAL GEMS ***
            
            actionmailer (2.3.8)
            actionpack (2.3.8)
            activerecord (2.3.8)
            activeresource (2.3.8)
            activesupport (3.0.0, 2.3.8)
            addressable (2.2.1)
            builder (2.1.2)
            facebook_oauth (0.2.0)
            faraday (0.4.6)
            ffi (0.6.3)
            hpricot (0.8.2)
            json (1.2.4)
            mime-types (1.16)
            multi_json (0.0.4)
            oauth (0.4.3, 0.3.5)
            oauth2 (0.0.13)
            rack (1.1.0)
            rails (2.3.8)
            rake (0.8.7)
            ruby-hmac (0.4.0)
            ruby-mysql (2.9.3)
            rubygems-update (1.3.7)
            sqlite3-ruby (1.3.1)
            tmail (1.2.7.1)
            twitter_oauth (0.4.3)
            

            服务器的 Ruby 版本:

            root@server1:~# ruby -v
            ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]
            

            感谢您的帮助。

            【讨论】:

              猜你喜欢
              • 2013-02-22
              • 1970-01-01
              • 2011-03-11
              • 1970-01-01
              • 2011-09-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多