web-dev-qa-db-de.com

API-Authentifizierung erstellen

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?

45
Xiaotian Guo

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

48
Jesse Wolgamott

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 .

2
janders223

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

1
chris_b

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'
0
Mark Swardstrom