Рельсы 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 в частности, чтобы быть уверенным, что я что-то не упустил.