Usar token de autenticación desde encabezados de solicitud en lugar de parámetros POST/PUT con Rails 3 / devise


Necesito usar la autenticación basada en tokens en una API de Rails 3.1 junto con la versión más reciente de devise. No hay problema hasta ahora.

Ahora no quiero añadir my :auth_token a los parámetros POST/PUT del lado del cliente, sino enviar este token como un encabezado de solicitud como HTTP_X_MYAPP_AUTH_TOKEN".

¿Puedo convencer a devise de usar eso en lugar de un token de parámetros? ¿Es posible implementar ambos, para que los usuarios de mi API puedan enviar el token a través del encabezado de solicitud O Parámetro POST / PUT?

Saludos. Felix

Author: GeorgieF, 2011-09-13

4 answers

Tenía la misma necesidad y se me ocurrió esta solución:

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

Tenga en cuenta que tengo mi dispositivo Devise.token_authentication_key establecido en api_key.

config.token_authentication_key = :api_key
 38
Author: Chris Conley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-28 13:55:48

Estoy usando una "estrategia" personalizada para esto: https://gist.github.com/4492569

 4
Author: Wojtek Kruszewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-09 11:49:51

En Devise es posible pasar un token de autenticación estándar a través de una cadena de consulta o el encabezado para la autenticación básica HTTP, consulte aquí. El código Ruby de las especificaciones para pasar el token en el encabezado HTTP_Authorization es

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

Las pruebas desde la línea de comandos con curl serían así:

echo  "HUGP59gXsd7773a75Dvc:X" | base64
=> SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=
curl --header "Authorization: Basic SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=" \ 
     http://localhost/users.xml
 4
Author: 0x4a6f4672,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:17

Usando devise y devise-token_authenticatable, tuve que establecer esto en mi config/initializers/devise.rb para pasar el token a través de encabezados http:

config.http_authenticatable = true

 1
Author: SharonM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-30 04:15:38