Приложение Ruby on Rails OAuth работает на клиенте, но не на сервере (OAuth :: Unauthorized (401 Unauthorized)) - PullRequest
3 голосов
/ 06 октября 2010

У меня есть приложение 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?

Я много раз искал эту ошибку и не получил никакого ответа, и поэтому я спрашиваю об этом здесь.

Спасибо.

Ответы [ 6 ]

1 голос
/ 08 мая 2013

Я обнаружил, что мой ключ и секретный ключ Twitter были в config / application.yml, и этот файл был указан в .gitignore, из-за чего он не передавался Heroku. В результате эта ошибка 401 обнаруживалась из Twitter OAuth, поскольку учетные данные приложения отсутствовали. Решением было найти строку в файле .gitignore, в которой упоминается любой файл конфигурации, который содержит учетные данные вашего приложения Twitter (или другого поставщика OAuth). После удаления строки из .gitignore выполните

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

и если вы на героку, то можете сделать

git push heroku master

и, надеюсь, это должно сработать.

0 голосов
/ 08 декабря 2010

Вполне возможно, что серверная среда, на которой вы пытаетесь ее использовать, использует какую-то настройку обратного прокси-сервера, где у сервера 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 - ваш друг.

0 голосов
/ 20 ноября 2010

Полагаю, есть перекос времени.Попробуйте синхронизировать часы, используя ntpdate (и использование ntp в целом тоже хорошая идея).

0 голосов
/ 06 октября 2010

Попробуйте восстановить исключение 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 говорит об этом немного .

У меня есть одно подозрение, что хостинг, который вы хотите использовать, может быть заблокирован провайдером из-за плохого поведения. В этом случае вам нужно поговорить с ними об этом.

Но мы не можем знать почему без дополнительной информации.

0 голосов
/ 06 октября 2010

Хорошо, вот рабочие гемы сервера и версия 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)

Рубиновая версия:

root@phcf:/www/rails# ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
0 голосов
/ 06 октября 2010

Извините. Камни, установленные на сервере:

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]

Спасибо за помощь.

...