0

寻找一种方法来执行一些代码,特别是在从使用 Fortify 和 JetStream 的 Laravel 8.x 框架注销时删除/过期一些 cookie。

我注意到几个帖子引用了相同的问题,但不太确定哪个是最好的以及如何实施。

这个: Laravel Fortify Logout Redirect看起来很有希望:

那里的第二个选项说:

创建一个新的 LogoutResponse 类并将重定向逻辑实现到 toResponse 方法中:

应用程序/Http/Responses/LogoutResponse.php

<?php

namespace App\Http\Responses;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Laravel\Fortify\Contracts\LogoutResponse as LogoutResponseContract;
use Symfony\Component\HttpFoundation\Response;

class LogoutResponse implements LogoutResponseContract
{
    /**
     * Create an HTTP response that represents the object.
     *
     * @param Request $request
     *
     * @return Response
     */
    public function toResponse($request)
    {
        return $request->wantsJson()
            ? new JsonResponse('', 204)
            : redirect('www.example.com');
    }
}

现在您可以在 FortifyServiceProvider 的 boot 方法中将新响应绑定到服务容器中:

app/Providers/FortifyServiceProvider.php

public function boot()
{
    $this->app->singleton(
        \Laravel\Fortify\Contracts\LogoutResponse::class,
        \App\Http\Responses\LogoutResponse::class
    );
}

另请参阅: Laravel Fortify

似乎只是做一个重定向,但在我的情况下,我实际上想要使一组 cookie 过期,并可能在 app/Http/Responses/LogoutResponse.php 中做更多的内务处理。

也不完全确定如何在 Laravel 中删除 cookie,?在某些情况下,用户可能实际上甚至没有登录,我可能想在他们关闭浏览器时删除一个 cookie(也许通过使用 JS 来检测关闭浏览器然后删除 Cookie(后端只有 HTTP cookie?)。

$cookie = \Cookie::forget('cookie_name');
4

1 回答 1

0

根据我的原始帖子,这似乎可行,尽管 LogoutResponse 与我最初发布的内容略有不同,因为它是此处 GitHub 上内容的修改版本:

强化/src/Http/Responses/LogoutResponse.php

<?php

namespace App\Http\Responses;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response;
use Laravel\Fortify\Contracts\LogoutResponse as LogoutResponseContract;

class LogoutResponse implements LogoutResponseContract
{
    /**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */

    // Added this & also code in App\Providers\FortifyServiceProvider.php to handle the deletion of the JWTVIEWER COOKIE.

    public function toResponse($request)
    {
        \Cookie::queue(\Cookie::forget('JWTVIEWER'));
        return $request->wantsJson()
                    ? new JsonResponse('', 204)
                    : redirect('/');
    }
}

命名空间不同,我添加了一些代码来删除我想在注销时过期的 cookie。代码与 FortifyServiceProvider.php 相同。

// Override the native LogoutResponse with one created in Responses.
$this->app->singleton(

    \Laravel\Fortify\Contracts\LogoutResponse::class,
    \App\Http\Responses\LogoutResponse::class
);

如果用户实际上主动注销,这似乎可行。我也很高兴能够捕获用户关闭浏览器或选项卡而不注销,但这需要 JS 并且有点问题。

例如检测浏览器或标签关闭

于 2021-10-10T19:28:23.560 回答