REST-интерфейс Rails с Kentico

Я пытаюсь получить доступ к интерфейсу REST из Kentico CMS и, похоже, не могу правильно получить к нему доступ в своем приложении Rails. Я могу получить к нему доступ в браузере, и я получаю всплывающее окно аутентификации имени пользователя/пароля, которое затем возвращает мне JSON после ввода правильных учетных данных.

В моем приложении Rails я использую rest-client и пытаюсь получить доступ через следующее:

username = 'username_here'
password = 'password_here'
page_url = 'page_url_here'

resource = RestClient::Resource.new(page_url, :username => username, :password => password)
response = resource.get

Также пробовал:

resource = RestClient::Resource.new(page_url)
resource.head :Authorization => Base64.encode64(username) + ":" + Base64.encode64(password)
response = resource.get

Оба выдают ошибку отказа в соединении. В документация Kentico говорит, что каждый запрос должен быть отправлен с авторизацией заголовок так:

Authorization: Basic <enter Base64-encoded <username>:<password> here>

Поэтому я предполагаю, что я не должен правильно отправлять заголовки, или, возможно, гем rest-client просто не подходит для этой задачи. Я открыт для использования других драгоценных камней или совершенно других подходов. Любая помощь приветствуется!

Изменить:

Мне удалось избавиться от ошибки отказа в соединении, изменив второй пример на следующий:

resource = RestClient::Resource.new(page_url)
resource.head :Authorization => "Basic " + Base64.encode64("%s:%s" % [username, password])

Однако теперь я получаю ошибку 405 Method Not Allowed. Есть ли что-то еще в заголовке, который отправляет браузер, чего нет у rest-client?


person David Savage    schedule 11.12.2012    source источник


Ответы (2)


Я еще немного погуглил и обнаружил, что RestClient — это просто оболочка для стандартной библиотеки Net::HTTP.

http://www.ruby-forum.com/topic/1648618

Прокрутка вниз этой страницы более того, я нашел то, что искал для базовой аутентификации:

uri = URI('http://example.com/index.html?key=value')

req = Net::HTTP::Get.new(uri.request_uri)
req.basic_auth 'user', 'pass'

res = Net::HTTP.start(uri.hostname, uri.port) {|http|
  http.request(req)
}
puts res.body

Для меня это намного проще, чем пытаться понять, как заставить RestClient делать то, что вы хотите. Надеюсь, это может помочь кому-то еще в будущем не тратить на это свое время, как я :)

person David Savage    schedule 11.12.2012

Я считаю, что первый пример должен быть

resource = RestClient::Resource.new(page_url, :user => username, :password => password)
response = resource.get

Это пользователь вместо имя пользователя.

person Jiří Pospíšil    schedule 11.12.2012
comment
Второй, вероятно, тоже должен работать, но я думаю, вы должны использовать Base64 для кодирования всей строки - Base64.encode64(%s:%s % [имя пользователя, пароль]) - person Jiří Pospíšil; 12.12.2012
comment
Хорошо, это исправляет ошибку отказа в соединении. Теперь я получаю 405 Method Not Allowed при попытке авторизации. Я не понимаю, почему это не происходит в браузере, а происходит через rest-client Rails. - person David Savage; 12.12.2012