php - 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.
错误。
解决方案
解释
您的 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 成功时删除该标记,以及在找到该标记时注销该用户,这实际上是所有要做的事情。但是,不是代码猴子,这个答案已经太长了。
它可以做到,但努力可能不值得。
推荐阅读
- vue.js - 如何使用 vue/vuex 从输入中过滤数据?
- python - 基本循环算法的时间复杂度
- mongodb - Mongo 的聚合帮助 - 为什么硬编码有效而不是 req.body?
- airflow - 如何防止气流中的“执行失败:[Errno 32] Broken pipe”
- android - 在连接的设备上运行颤振应用程序时出现问题
- shopify - 调用 page_title 到 Shopify 页面内容
- kotlin - 从 Mono 列表中获取第一个 onNext 信号
- javascript - ajax POST 调用中的土耳其语字符已损坏
- php - 如何使用幻灯片在 php 中显示数据库中的多个图像
- c# - Unity - 让角色走向触摸/拖动位置?在 3D 空间中?