Страница все еще аутентифицирована после выхода из gitlab - PullRequest
0 голосов
/ 29 января 2020

Я использую KnpUOAuth2ClientBundle для Symfony 5 . Когда я захожу на страницу, если пользователь не вошел в систему, он перенаправляется на страницу gitlab и при аутентификации он успешно перенаправляет на мою домашнюю страницу, где хранит cook ie.

Но после того, как я выхожу из gitlab и проверяю свою домашнюю страницу , он все еще работает при сохранении cook ie.

Кажется, это ошибка. Что мне делать, чтобы при выходе из gitlab повар ie очищался.

Это мой security.yaml файл

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        app_user_provider:
            id: App\Security\UserProvider
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: true
            guard:
                authenticators:
                    - App\Security\GitlabAuthenticator
    access_control:
        - { path: ^/connect, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/, roles: ROLE_USER }

Я не уверен, что я пытаюсь делать правильно или нет. Внутри GitlabAuthController у меня есть метод connectAction, где я пытаюсь очистить повар ie set

  public function connectAction(ClientRegistry $clientRegistry): RedirectResponse
    {
        if ($this->logout()->getStatusCode() === 200) {
            // will redirect to gitlab!
            return $clientRegistry
                ->getClient('gitlab') // key used in config/packages/knpu_oauth2_client.yaml
                ->redirect()
                ;
        }
    }

public function logout()
    {
        $response = new Response();
        $response->headers->clearCookie('PHPSESSID');
        return $response->send();
    }

Но с этим я получаю Invalid state parameter passed in callback URL. ошибку.

1 Ответ

2 голосов
/ 29 января 2020

объяснение

Ваш Symfony использует gitlab в качестве провайдера аутентификации (например: «Я не хочу самостоятельно обрабатывать логины и не хочу хранить пароли»). Это подразумевает, однако, что symfony и gitlab не используют один и тот же сеанс. Выход из gitlab ничего не значит для вашего сайта symfony и наоборот. Поэтому то, что вы описываете как «Это похоже на ошибку» (si c), на самом деле является именно ожидаемым поведением.

То, что вы, очевидно, хотите, так или иначе объединить обе сессии.

Следующее ответ носит теоретический характер и предполагает, что gitlab предлагает функции, которые я описываю по умолчанию, или они должны быть реализованы кем-то способным (в вашем предположительно самостоятельно размещенном gitlab), что приведет к созданию gitlab fork, что в долгосрочной перспективе, вероятно, является плохой идеей , При этом:

наивный подход

При выходе из gitlab перенаправьте пользователя на свою страницу symfony выхода из системы (или, для предотвращения CSRF, определенную c страницу выхода из системы с некоторым проверяемым токеном , как JWT или аналогичный). Поскольку я не знаю много о gitlab, я не знаю ни одного параметра конфигурации gitlab, который бы позволял это.

Однако любой, обладающий достаточными техническими знаниями, может предотвратить перенаправление и, следовательно, все еще оставаться в системе.

более сложное решение (и технически более надежное)

При выходе из gitlab gitlab (не браузер!) Должен был бы вызвать некоторый API на вашем Symfony сайте с проверяемым токеном, чтобы пометить пользователя как вышедшего из системы. Symfony, с другой стороны, придется проверять эту отметку при каждом запросе (возможно, через EventListener) и выходить из системы в случае обнаружения пользователя. Однако он должен быть отключен, как только пользователь снова войдет в систему через OAuth.

Технически, gitlab должен был бы иметь веб-крючок для выхода из системы, чтобы это работало без манипуляций с самим gitlab, иначе вы окажетесь на месте. что вам придется добавить эту функцию в gitlab (через расширение / плагин / ..., если таковые существуют, или добавить код в сам gitlab, который является форком и который будет плохим в долгосрочной перспективе). Другой веб-крючок может убрать пометку с пользователя при успешном завершении oauth.

Поскольку я не очень много знаю о самом gitlab и о том, как именно это будет реализовано, я не буду и не могу предоставить конкретную информацию c инструкции на стороне gitlab. Gitlab предлагает веб-хуки, но они больше связаны с событиями, происходящими с репозиториями (вики, конвейер, проблемы, коммиты, ...) и ничем не связаны с самими пользователями.

Со стороны symfony отметка кто-то из пользователей вышел из системы и снял отметку, когда oauth успешен, а также вышел из системы пользователя, когда отметка была найдена, - это действительно все, что нужно сделать. Однако, не кодовая обезьяна, и этот ответ уже слишком длинный.

Это можно сделать, но усилия могут просто не стоить этого.

...