with rails based ruby-on-rails ruby json api devise

ruby-on-rails - based - ruby on rails jwt



DiseƱar autenticaciĆ³n API (4)

Devise se basa en Warden, un middleware de autenticación para Rack.

Si necesita implementar su propia forma (alternativa) para autenticar a un usuario, debe echarle un vistazo a Warden en combinación con las estrategias que se incluyen con Devise: https://github.com/plataformatec/devise/tree/master/lib/devise/strategies

Estoy trabajando en una aplicación web de rieles que también proporciona API basada en JSON para dispositivos móviles. se espera que los clientes móviles primero obtengan un token con (correo electrónico / pase), luego los clientes realizarán llamadas API subsiguientes con el token.

Soy bastante nuevo en Devise, y estoy buscando un API Devise que parezca "autenticar (correo electrónico, pase) y espero que sea verdadera / falsa, luego basándome en eso, crearé y devolveré el token o devolveré un rechazo. mensaje, pero parece que Devise no ofrece algo como esto.

Soy consciente de que Devise 1.3 proporciona autenticación basada en JSON, pero eso es un poco diferente de lo que necesito: necesito generar el token y manejarlo de vuelta al cliente, luego de eso, la autenticación se realiza utilizando el token.

¿Alguien puede dar algunos consejos?


Recomiendo leer a través de Devise Wiki , ya que Devise admite nativamente la autenticación de tokens como uno de sus módulos. No he trabajado personalmente con la autenticación de tokens en Devise, pero Brandon Martin tiene un ejemplo de autenticación de token de ejemplo here .


Si token auth simplemente no es lo que desea hacer, también puede devolver una cookie y hacer que el cliente incluya la cookie en el encabezado de la solicitud. Funciona muy similar al controlador de sesiones web.

En un controlador de sesiones API

class Api::V1::SessionsController < Devise::SessionsController skip_before_action :authenticate_user! skip_before_action :verify_authenticity_token def create warden.authenticate!(:scope => :user) render :json => current_user end end

En Rutas

namespace :api, :defaults => { :format => ''json'' } do namespace :v1 do resource :account, :only => :show devise_scope :user do post :sessions, :to => ''sessions#create'' delete :session, :to => ''sessions#destroy'' end end end

Entonces puedes hacer este tipo de cosas (ejemplos están usando HTTPie )

http -f POST localhost:3000/api/v1/sessions user[email][email protected] user[password]=passw0rd

Los encabezados de respuesta tendrán una sesión en el encabezado Set-Cookie. Pon el valor de esto en solicitudes posteriores.

http localhost:3000/api/v1/restricted_things/1 ''Cookie:_my_site_session=<sessionstring>; path=/; HttpOnly''


Hay una configuración de :token_authenticatable llamada :token_authenticatable . Entonces, si agrega eso al método de diseño en su "usuario", entonces puede autenticarse en su API simplemente llamando

"/api/v1/recipes?qs=sweet&auth_token=[@user.auth_token]"

Probablemente también quieras esto en tu usuario:

before_save :ensure_authentication_token

ACTUALIZACIÓN (con código de autorización API)

El método que estás buscando es:

resource = User.find_for_database_authentication(:login=>params[:user_login][:login]) resource.valid_password?(params[:user_login][:password])

aquí está mi esencia con un inicio de sesión JSON / API a escala completa con el diseño