我正在将 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.
错误。
答案 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成功时删除该标记,以及在找到该标记时注销用户,实际上就是所有要做的事情。但是,不是代码猴子,这个答案已经太长了。
可以做到,但是付出的努力可能不值得。