2011-09-13 6 views
23

Necesito usar la autenticación basada en token en una API de Rails 3.1 junto con la versión más reciente de idear. No hay problema hasta el momento.Usar auth_token desde los encabezados de solicitud en lugar de los parámetros POST/PUT con Rails 3/idear

Ahora bien, no quiero añadir mi:. Auth_token a los parámetros de POST/PUT en el lado del cliente, sino enviar esta señal como una cabecera de petición como HTTP_X_MYAPP_AUTH_TOKEN"

¿Puedo convencer a idear el uso que en lugar de una ficha a partir de parámetros? ¿es posible implementar tanto, para que mis usuarios de la API pueden enviar la ficha a través de cabecera de la petición o parámetro de POST/PUT?

Saludos. Felix

Respuesta

37

que tenía la misma necesidad y se acercó con 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 

Nota Tengo mi dispositivo Devise.token_authentication_key establecido en api_key.

config.token_authentication_key = :api_key 
+0

Hey Chris, buena solución, al igual que. Creé mi propio parche para diseñar mientras tanto, también funciona. Sus soluciones parecen ser una buena opción para todos los que enfrentan el mismo problema en el futuro. – GeorgieF

+2

Hmm no funciona para mí: -/ '' 'get_api_key''' se ejecuta correctamente antes' '' authenticate_user! '' 'Pero, por desgracia, en este momento el middleware Warden Rack ya ha analizado Params y tiene su propio copia de params que no notará agregado: elemento api_key. –

+1

Buena idea, pero creo que estoy teniendo el mismo problema que @WojtekKruszewski – elsurudo

4

Es posible en Diseñar para pasar un token de autenticación estándar a través de la cadena de consulta o la cabecera de autenticación básica HTTP, consulte here. El código Ruby a partir de las especificaciones de paso de testigo en la cabecera HTTP_AUTHORIZATION es

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

Prueba de la línea de comandos con el enrollamiento iría así:

echo "HUGP59gXsd7773a75Dvc:X" | base64 
=> SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo= 
curl --header "Authorization: Basic SFVHUDU5Z1hzZDc3NzNhNzVEdmM6WAo=" \ 
    http://localhost/users.xml 
1

El uso de idear y diseñar-token_authenticatable, tuve que establecer esto en mi config/inicializadores/devise.rb con el fin de pasar el testigo a través de cabeceras http:

config.http_authenticatable = true

Cuestiones relacionadas