Как требовать ручного одобрения администратором приложения OAuth при использовании Doorkeeper? - PullRequest
0 голосов
/ 18 июня 2019

Допустим, у нас есть Users (кто может создать Doorkeeper::Application с).С другой стороны, у нашего приложения есть Admins, которые в идеале должны проверять каждое создаваемое приложение (и, возможно, делать проверку в фоновом режиме при создании пользователя, а что нет), а также его области действия.Они могут #approve! или #reject! Приложение и только если оно равно approved, Приложение может выполнять вызовы API.

ПРИМЕЧАНИЕ : #approve!, #reject!и approved не приходят с портье, насколько я знаю.Они гипотетичны, поэтому мой вопрос яснее.

Можно ли добиться такого поведения с помощью Привратника (или расширения)?Я не думаю, что что-то подобное описано в файле конфигурации.Если нет, есть ли у вас какие-либо общие шаги относительно того, как это можно сделать?

Я думаю, что что-то подобное может сработать

class Api::V1::TransactionalBaseController < Api::V1::AuthableController
  before_action :doorkeeper_authorize!
  before_action :check_application_status!

  private
  def check_application_status!
    application = doorkeeper_token.application
    unless application.approved?
      raise Doorkeeper::Errors::ApplicationForbidden.new
    end
  end
end

Если это что-то, что может помочь другим пользователямЯ могу открыть PR или разработать расширение для достижения этой цели.

1 Ответ

0 голосов
/ 19 июня 2019

rails g migration AddApprovedAtRejectedAtToOauthApplications approved_at:datetime rejected_at:datetime

Отредактируйте файл, чтобы отразить правильную таблицу.

Помня, что Ruby позволяет вам изменять класс из любого места ... В инициализаторе (или аналогичном); от https://github.com/doorkeeper-gem/doorkeeper/issues/153:

doorkeeper_extend_dir = File.join(Rails.root, "app", "models", "doorkeeper")
Dir.glob("#{doorkeeper_extend_dir}/*.rb").each { |f| require(f) }

# app/models/doorkeeper/application.rb
module Doorkeeper
  class Application < ActiveRecord::Base
    def approved?
      approved_at?
    end

    def rejected?
      rejected_at?
    end

    def approve!
      update_column(:approved_at, DateTime.now)
    end  

    def reject!
      update_column(:rejected_at, DateTime.now)
    end
  end
end
...