tutorial tokens rails hacer gema como ruby-on-rails devise token

ruby on rails - rails - Usar tokens Devise para iniciar sesión, ¿está integrado?



rails authentication (3)

Por lo tanto, estoy tratando de usar tokens con Devise (versión 1.0.3 con Rails 2.3.8) para permitir que un usuario inicie sesión, pero no estoy del todo seguro por dónde empezar.

http://zyphdesignco.com/blog/simple-auth-token-example-with-devise

El tutorial anterior me ayudó a activar la funcionalidad del token y mostró cómo generar (o eliminar) tokens ... pero todo el PUNTO de los tokens es usarlos para autorizar a un usuario, ¿correcto?

Cuando miro a un usuario en la consola, puedo decir user.authentication_token, y recuperar algo como: "Qm1ne93n_XkgmQTvxDmm", que está muy bien ... pero, ¿a dónde voy desde allí?

Intenté pulsar la raíz de sign_in usando el siguiente comando de línea de comando:

curl -d "authentication_token = Qm1ne93n_XkgmQTvxDmm" localhost: 3000 / users / sign_in

Y definitivamente no tuvo un inicio de sesión exitoso.

En el controlador de sesiones, veo que llaman:

autenticar (resource_name)

Lo que estoy ASUMIENDO está en algún lugar del módulo:

incluye Devise :: Controllers :: InternalHelpers

que se incluye, pero no sé dónde buscar eso (definitivamente no está en la carpeta del controlador de la fuente). Si pudiera ver cómo funciona la autenticación, podría ver si incluso MIRA fichas ...

¿HACE Devise le permite iniciar sesión con tokens, o solo tiene un marco para generarlos? Si te permite iniciar sesión con ellos ... ¿CÓMO lo haces? ¿No puedes usar curl (es decir, tiene que estar en un navegador?) Si es así, tendría que lanzar mi propia solución, NECESITO soporte no compatible con el navegador). Si no es así, ¿cómo puedo hacer mi propio?


Este fue un buen punto de partida para mí:

Migración para agregar authentication_token :

class AddTokenBasedAuthentication < ActiveRecord::Migration def change add_column :users, :authentication_token, :string add_index :users, :authentication_token, unique: true end end

Y luego en el controlador de la aplicación:

class ApplicationController < ActionController::Base before_filter :authenticate_user_from_token! before_action :authenticate_user!, except: <your login GET action> private def authenticate_user_from_token! email = params[:email].presence user = email && User.find_by(email: email) sign_in user if user && Devise.secure_compare(user.authentication_token, params[:auth_token]) end end

Y luego la construcción del enlace es solo

www.yoursite.com/[email protected]&auth_token=whatever_auth_token_is_stored_for_that_user

fuentes: esta esencia ligada a la wiki de devise , y web.archive.org/web/20101003082438/http://… (mencionado anteriormente)



Tengo entendido que puede usar los tokens para iniciar sesión o para acceder a páginas arbitrarias que necesitan autenticación, incluso con cURL. Si miras en config/initializers/devise.rb , debería haber una línea que diga algo así como:

config.token_authentication_key = :auth_token

Cualquiera que sea el nombre de token_authentication_key debe coincidir con lo que pone como consulta o parámetro de formulario en su solicitud. Usaste authentication_token en tu ejemplo, no estoy seguro si cambiaste el archivo devise.rb para que coincida o no.

Si quiere descubrir cómo funcionan las cosas internamente, probaría git clone git://github.com/plataformatec/devise.git y buscaría los métodos que necesita aclaración.

Aquí hay algunas solicitudes cURL de muestra (hice un Users :: SessionsController personalizado que extiende Devise :: SessionsController y anula el método create para manejar JSON.)

class Users::SessionsController < Devise::SessionsController def create resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new") set_flash_message(:notice, :signed_in) if is_navigational_format? sign_in(resource_name, resource) respond_to do |format| format.html do respond_with resource, :location => redirect_location(resource_name, resource) end format.json do render :json => { :response => ''ok'', :auth_token => current_user.authentication_token }.to_json, :status => :ok end end end end

Y luego las solicitudes de cURL que di:

curl -X POST ''http://localhost:3000/users/sign_in.json'' -d ''user[email][email protected]&user[password]=password'' -> {"response":"ok","auth_token":"ABCDE0123456789"} curl -L ''http://localhost:3000/profile?auth_token=ABCDE0123456789'' -> got page that I wanted that needs authentication