Ich arbeite an einer Rails-Webanwendung, die auch eine JSON-basierte API für mobile Geräte bietet. Von mobilen Clients wird erwartet, dass sie zunächst ein Token mit (E-Mail/Pass) abrufen. Anschließend führen Clients untergeordnete API-Aufrufe mit dem Token durch.
Ich bin ziemlich neu bei Devise, und ich suche nach einem Devise-API-Aussehen wie authenticate(email, pass)
und erwarte, dass es true/false zurückgibt. Danach werde ich entweder das Token erstellen und zurückgeben oder eine Ablehnungsnachricht zurückgeben. aber scheinbar liefert Devise so etwas nicht.
Ich bin mir bewusst, dass Devise 1.3 JSON-basierte Authentifizierung bietet, aber das unterscheidet sich ein wenig von dem, was ich brauche - ich muss ein Token generieren und es an den Client zurückgeben, danach wird die Authentifizierung stattdessen mit dem Token durchgeführt.
Kann jemand bitte ein paar Hinweise geben?
Es gibt eine Gerätekonfiguration namens :token_authenticatable
. Wenn Sie das also zur "devise" -Methode in Ihrem "Benutzer" hinzufügen, können Sie sich in Ihrer API nur durch Aufruf authentifizieren
"/api/v1/recipes?qs=sweet&auth_token=[@user.auth_token]"
Wahrscheinlich möchten Sie dies auch in Ihrem Benutzer:
before_save :ensure_authentication_token
UPDATE (mit API-Autorisierungscode)
Die Methode, die Sie suchen, ist:
resource = User.find_for_database_authentication(:login=>params[:user_login][:login])
resource.valid_password?(params[:user_login][:password])
hier ist mein Gist mit einem vollständigen JSON/API-Login mit devise
Ich würde empfehlen, das Devise Wiki zu lesen, da Devise die Token-Authentifizierung nativ als eines seiner Module unterstützt. Ich habe in Devise nicht persönlich mit der Tokenauthentifizierung gearbeitet, aber Brandon Martin hat ein Beispiel für die Tokenauthentifizierung here .
Devise basiert auf Warden, einer Authentifizierungs-Middleware für Rack.
Wenn Sie einen eigenen (alternativen) Weg zur Authentifizierung eines Benutzers implementieren müssen, sollten Sie Warden in Kombination mit den Strategien von Devise betrachten: https://github.com/plataformatec/devise/tree/master/lib/devise/strategien
Wenn Tokenauth einfach nicht das ist, was Sie tun möchten, können Sie auch ein Cookie zurückgeben und den Client dazu veranlassen, das Cookie in den Anforderungsheader aufzunehmen. Es funktioniert sehr ähnlich wie der Websitzungscontroller.
In einem API-Sitzungscontroller
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
In Routen
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
Dann können Sie so etwas tun (Beispiele verwenden HTTPie )
http -f POST localhost:3000/api/v1/sessions user[email][email protected] user[password]=passw0rd
Die Antwortheader haben eine Sitzung im Set-Cookie-Header. Geben Sie den Wert für nachfolgende Anforderungen an.
http localhost:3000/api/v1/restricted_things/1 'Cookie:_my_site_session=<sessionstring>; path=/; HttpOnly'