【问题标题】:Doorkeeper resource owner credential flow for multiple models多个模型的 Doorkeeper 资源所有者凭证流
【发布时间】:2014-09-14 14:38:56
【问题描述】:

我遇到的问题是我正在使用门卫resource owner credential flow 对来自 iOS 应用程序的用户进行身份验证。我的项目有两个独立的用户模型(我们称它们为用户和管理员)。我的代码如下所示:

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

它有效,但我如何也检查管理员?换句话说,我不知道登录的人是用户还是管理员 - 我如何检查两者?

【问题讨论】:

    标签: ruby-on-rails doorkeeper


    【解决方案1】:

    Doorkeeper 为此提供了Scopes(参见https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes

    所以在你的 doorkeeper.rb 文件中你可以这样做:

    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  
    

    然后,为了验证您的资源(例如管理员),您可以提出这样的请求:

    POST $HOST/oauth/token
    {
      email: john@doe.com
      password: johndoe
      grant_type: password
      scope: admin
    }
    

    【讨论】:

    • 谢谢!我很久以前就放弃了,但今天我必须完成这个项目。我回到这里打算再次发布这个问题并找到你的答案。这正是我想要的。谢谢!
    【解决方案2】:

    您可以通过传入一个额外的参数并根据该参数选择要进行身份验证的模型来做到这一点。这与 gdonato 的回答类似,但 doorkeeper 中的范围更适合用于管理向经过身份验证的应用授予哪些权限(即“授予此应用代表您读取 X 和写入 Y”的权限)。

    这是我正在使用的

    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
    

    请注意,如果您要使用范围而不是门卫尚未用于其他用途的参数来执行此操作,则必须配置范围,例如:

    # 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
    

    使用范围作为参数来区分 User 和 Admin 可能无需在 doorkeeper.rb 中调整 default_scopes 或 optional_scopes 即可工作,但只是作为 doorkeeper 期望的范围界定的副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2019-01-03
      • 2015-01-06
      • 1970-01-01
      • 2015-08-16
      • 2016-12-31
      • 2014-03-31
      相关资源
      最近更新 更多