Использование auth_token из заголовков запросов вместо параметров POST / PUT с Rails 3 / devise - PullRequest
24 голосов
/ 13 сентября 2011

Мне нужно использовать аутентификацию на основе токенов в Rails 3.1 API в сочетании с самой последней версией devise.Пока проблем нет.

Теперь я не хочу добавлять my: auth_token к параметрам POST / PUT на стороне клиента, но отправляю этот токен в виде заголовка запроса, например HTTP_X_MYAPP_AUTH_TOKEN ".

Могу ли я убедить разработчика использовать этоа не токен из параметров? Можно ли реализовать оба, чтобы мои пользователи API могли отправлять токен через заголовок запроса ИЛИ параметр POST / PUT?

С уважением. Феликс

Ответы [ 4 ]

38 голосов
/ 28 сентября 2011

У меня была такая же потребность, и я предложил это решение:

class YourController < ApplicationController
  prepend_before_filter :get_api_key
  before_filter :authenticate_user!

  private
  def get_api_key
    if api_key = params[:api_key].blank? && request.headers["X-API-KEY"]
      params[:api_key] = api_key
    end
  end
end

Примечание. У меня для устройства Devise.token_authentication_key установлено значение api_key.

.
config.token_authentication_key = :api_key
4 голосов
/ 12 марта 2013

В Devise можно пропустить стандартный токен аутентификации через строку запроса или заголовок HTTP Basic Authentication, см. здесь .Код Ruby из спецификации для передачи токена в заголовке HTTP_Authorization:

header = "Basic #{Base64.encode64("#{VALID_AUTHENTICATION_TOKEN}:X")}"
get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => header

Тестирование из командной строки с помощью curl будет выглядеть так:

echo  "HUGP59gXsd7773a75Dvc:X" | base64
=> SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=
curl --header "Authorization: Basic SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=" \ 
     http://localhost/users.xml
4 голосов
/ 09 января 2013

Я использую собственную «стратегию» для этого: https://gist.github.com/4492569

1 голос
/ 30 марта 2015

Используя devise и devise-token_authenticatable, мне пришлось установить это в моем config / initializers / devise.rb, чтобы передать токен через заголовки http:

config.http_authenticatable = true

...