2014-09-14 24 views
7

Das Problem, das ich habe, ist, dass ich Türhüter resource owner credential flow verwenden, um einen Benutzer aus einer iOS-App zu authentifizieren. Mein Projekt hat jedoch zwei separate Benutzermodelle (nennen wir sie User und Admin). Mein Code sieht wie folgt aus:Doorkeeper Resource Owner Credential Flow für mehrere Modelle

resource_owner_from_credentials do |routes| 
    user = User.find_for_database_authentication(:email => params[:username]) 
    user if user && user.valid_password?(params[:password]) 
end 

Es funktioniert, aber wie mache ich einen Scheck für den Admin auch? Mit anderen Worten, ich weiß nicht, ob die Person, die sich anmeldet, ein Benutzer oder Admin ist - wie überprüfe ich beide?

Antwort

9

Pförtner bietet Scopes für diesen Zweck (siehe https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes)

Also in Ihrem doorkeeper.rb Datei können Sie tun:

resource_owner_from_credentials do |routes| 
    if params[:scope].present? 
    case params[:scope] 
     when "user" 
     u = User.find_for_database_authentication(:email => params[:email]) 
     when "admin" 
     u = Admin.find_for_database_authentication(:email => params[:email]) 
    end 
    else 
    #default auth 
    u = User.find_for_database_authentication(:email => params[:email]) 
    end 
    u if u && u.valid_password?(params[:password]) 
end 

Dann für Ihre Ressource zu authentifizieren (ex Admin.) Können Sie machen Sie eine Anfrage wie folgt:

POST $HOST/oauth/token 
{ 
    email: [email protected] 
    password: johndoe 
    grant_type: password 
    scope: admin 
} 
+1

DANKE! Ich habe das vor langer Zeit aufgegeben, aber heute musste ich das Projekt abschließen. Ich kam hierher zurück, um diese Frage noch einmal zu stellen und fand deine Antwort. Es war genau das, wonach ich suchte. DANKE! –

1

Sie tun dies, indem Sie einen zusätzlichen Parameter übergeben, und wählen Sie die mo del, die Sie basierend auf diesem Parameter authentifizieren möchten. Dies ist der Antwort von gdonato ähnlich, aber Scopes in doorkeeper werden besser dafür verwendet, zu verwalten, welche Berechtigungen der authentifizierten App erteilt werden (z. B. "Gib dieser App die Erlaubnis, X zu lesen und schreibe Y in deinem Namen").

Hier ist, was ich verwende

resource_owner_from_credentials do |routes| 
    if params[:user_type].present? 
    case params[:user_type] 
    when 'user' 
     u = User.find_for_database_authentication(email: params[:email]) 
    when 'employer' 
     u = Employer.find_for_database_authentication(email: params[:email]) 
    when 'admin' 
     u = Administrator.find_for_database_authentication(email: params[:email]) 
    end 
    end # I don't want a default auth user_type, so no 'else' block for me 
    user if user && user.valid_password?(params[:password]) 
end 

Beachten Sie, dass, wenn Sie diese mit Tive anstelle eines param, die Pförtner für etwas anderes nicht bereits mit täte ist, werden Sie die Bereiche konfigurieren müssen wie:

# These are found in doorkeeper.rb, but they're commented by default. 
# You would use whatever scopes you're wanting to check 
default_scopes :public 
optional_scopes :write, :update 

als param verwendet Umfang zwischen User und Admin zu unterscheiden könnte funktionieren ohne default_scopes oder optional_scopes in doorkeeper.rb jiggering, sondern nur als Nebeneffekt des Scoping dass Pförtner erwartet.