退出gitlab后页面仍通过身份验证

时间:2020-01-29 10:25:23

标签: php symfony oauth-2.0 gitlab symfony5

我正在将 KnpUOAuth2ClientBundle 用于 Symfony 5 。当我进入页面时,如果未登录用户,则它将重定向到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.错误。

1 个答案:

答案 0 :(得分:2)

解释

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

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

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

天真的方法

在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成功时删除该标记,以及在找到该标记时注销用户,实际上就是所有要做的事情。但是,不是代码猴子,这个答案已经太长了。

可以做到,但是付出的努力可能不值得。

相关问题