2014-09-14 6 views
7

Kullanmakta olduğum sorun, bir iOS uygulamasından kullanıcının kimliğini doğrulamak için resource owner credential flow numaralı kapıları kullanıyorum. Projemde iki ayrı kullanıcı modeli var (onlara Kullanıcı ve Yönetici olarak adlandıralım). Kodum şunun gibi:Birden fazla model için kapıcı kaynağı sahibi kimlik bilgisi akışı

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

Çalışıyor, ancak yönetici için nasıl bir denetim yapacağım? Başka bir deyişle, giriş yapan kişinin bir kullanıcı mı yoksa yönetici mi olduğunu bilmiyorum - ikisini de nasıl kontrol ederim?

cevap

9

Kapıcı bu amaçla Falınızı sağlar yapabileceğinizle doorkeeper.rb dosyasında Yani

(https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes bakınız): Sonra

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 

kaynağınız (ex Yönetici.) Yapabilirsiniz kimlik doğrulaması için böyle bir istekte bulunun:

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

TEŞEKKÜR EDERİZ! Bunu uzun zaman önce bıraktım ama bugün projeyi tamamlamak zorunda kaldım. Bu soruyu tekrar yayınlamayı ve cevabınızı bulmayı planladım. Tam olarak aradığım şey buydu. TEŞEKKÜR EDERİM! –

1

Bunu ek bir paramitten geçirerek ve Bu param temel alınarak kimlik doğrulaması yapmak istersiniz. Bu, gdonato'nun cevabına benzer, ancak kapıcıdaki kapsamlar, kimliği doğrulanmış uygulamaya hangi izinlerin verildiğini yönetmek için daha iyi kullanılır (örn. "X'e ve Y adına sizin adınızı yazmasına izin ver"). İşte

Sana olsaydı yerine kapıcı zaten başka bir şey için kullanmayan bir param kapsamlarını kullanarak bunu yapmak pek

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 

Not kullanıyorum buydu sen kapsamları yapılandırmak gerekecek gibi: ama sadece o kapıcı beklemektedir kapsam belirlemenin bir yan etkisi olarak, doorkeeper.rb içinde default_scopes veya optional_scopes jiggering olmadan işe yarayabilecek Kullanıcı ve Yönetici birbirinden ayırt edebilmek için param olarak kapsam kullanılması

# 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 

.