Разрешить пользователям отзывать токен с Doorkeeper - PullRequest
0 голосов
/ 28 июня 2018

Рельсы 5.2.0, Doorkeeper 5.0.0 RC1, Devise 4.4.3.

Я подключил Doorkeeper к существующему приложению Rails, которое использует Devise для аутентификации пользователя. Цель состоит в том, чтобы иметь возможность аутентифицировать конкретное приложение (например, мобильное приложение) для нескольких пользователей и позволить пользователю иметь несколько аутентифицированных экземпляров приложения (например, для нескольких устройств), но позволить этим пользователям индивидуально аннулировать доступ к один экземпляр приложения.

Будет один экземпляр Doorkeeper :: Application, тогда процесс Поток кода авторизации будет выполняться каждый раз, когда пользователь хочет аутентифицировать приложение. В config / initializers / doorkeeper.rb у меня есть

Doorkeeper.configure do 
  resource_owner_authenticator do
    current_user || warden.authenticate!(scope: :user)
  end
end

Таким образом, если пользователь вошел в систему, он сразу перейдет к представлению «Требуется авторизация» (как на вики-странице; я еще не настроил это), но в противном случае пользователь сначала попросит войти в систему, код возвращается, и это можно обменять на токен доступа и токен обновления. Пока все хорошо.

Однако, когда дело доходит до отзыва токена, у меня возникает та же проблема, что и у Отзыв токена не работает для публичных клиентов # 891 . Я хочу вызвать / oauth / revoke с токеном и отозвать его, не используя секрет приложения или не отменяя приложение (либо глобально, либо все экземпляры для пользователя).

Однако, это не работает по той же причине, что и в проблеме GitHub - поскольку контроллер токенов не проверяет resource_owner_authenticator, он не может знать, был ли запрос на отзыв токена от владельца ресурса, поэтому авторизован? возвращает false и ничего не происходит.

В качестве альтернативы я взломал это вместе - он не завершен (например, он никогда не отправит ответ), но имеет ли этот подход смысл?

before_action :authenticate_user!
def revoke_oauth_token
  token_string = params[:token]

  unless current_user.nil?
    unless token_string.nil?
      token = Doorkeeper::AccessToken.find_by("resource_owner_id = ? AND token = ?", current_user.id, token_string)

      unless token.nil?
        token.revoke
      else
        # current_user doesn't own the token or the token doesn't exist
      end
    end
  else
    # should be redirected to the login page because of authenticate_user
    # but just in case
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...