首页 > 解决方案 > gitlab 注销后页面依然认证

问题描述

我正在为Symfony 5使用KnpUOAuth2ClientBundle。当我进入页面时,如果用户没有登录,那么它会重定向到 gitlab 页面,并在身份验证时成功重定向到我存储 cookie 的主页。

但是在我注销 gitlab 并检查我的主页后,它仍然可以作为存储 cookie 的工作。

这似乎是错误的。我应该怎么做,如果 gitlab 退出,cookie 被清除。

这是我的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 方法,我试图清除 cookie 集

  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.错误。

标签: phpsymfonyoauth-2.0gitlabsymfony5

解决方案


解释

您的 Symfony 使用 gitlab 作为身份验证提供程序(如:“我不想自己处理登录,也不想存储密码”)。然而,这意味着 symfony 和 gitlab 不共享同一个会话。退出 gitlab 对您的 symfony 站点没有任何意义,反之亦然。因此,您所描述的“这似乎是错误”(原文如此)实际上正是预期的行为。

您显然想要的是以某种方式合并两个会话。

以下答案具有理论性质,并假设 gitlab 默认提供我描述的功能,或者它们必须由有能力的人实现(在您假定的自托管 gitlab 中),这将导致 gitlab 分叉,从长远来看可能是馊主意。话虽如此:

幼稚的方法

在 gitlab 注销时,将用户重定向到您的 symfony 注销页面(或者,为了防止 CSRF,带有一些可验证令牌的特定注销页面,例如 JWT 或类似的)。由于我对 gitlab 了解不多,因此我不知道任何允许这样做的 gitlab 配置参数。

但是,任何具有足够技术知识的人都可以阻止重定向,因此仍然保持登录状态。

更精细的解决方案(技术上更合理)

在 gitlab 注销时,gitlab(不是浏览器!)必须在您的 Symfony 站点上调用一些 API,并使用可验证的令牌将用户标记为已注销。另一方面,Symfony 必须在每个请求上检查该标记(可能通过 EventListener)并注销用户以防万一。但是,一旦用户通过 OAuth 重新登录,它就必须取消设置。

从技术上讲,gitlab 必须在注销时使用 webhook 才能在不操纵 gitlab 本身的情况下工作,否则您会发现自己必须在 gitlab 中添加此功能(通过扩展/插件/...,如果那些存在或将代码添加到 gitlab 本身,这是一个分支,从长远来看会很糟糕)。另一个 webhook 可以在成功 oauth 时删除用户上的标记。

由于我对 gitlab 本身以及如何准确实现这一点了解不多,因此我不会也无法在 gitlab 方面提供具体说明。Gitlab 确实提供了 webhook,但这些与存储库(wiki、管道、问题、提交等)发生的事件更相关,与用户本身无关。

在 symfony 方面,将某人标记为已注销并在 oauth 成功时删除该标记,以及在找到该标记时注销该用户,这实际上是所有要做的事情。但是,不是代码猴子,这个答案已经太长了。

它可以做到,但努力可能不值得。


推荐阅读