ycs77/laravel-recover-session

当表单从第三方API返回时恢复Laravel会话。

资助包维护!
Patreon

v1.2.0 2023-06-20 09:48 UTC

This package is auto-updated.

Last update: 2024-08-31 00:33:33 UTC


README

Latest Version on Packagist Software License GitHub Tests Action Status Style CI Build Status Total Downloads

当表单从第三方API返回时恢复Laravel会话。

安装

通过Composer

composer require ycs77/laravel-recover-session

发布配置

php artisan vendor:publish --tag=recover-session-config

使用

目前,Laravel的Cookie SameSite的默认值设置为Lax。这阻止了在通过表单提交将数据传输到其他域的网站时发送cookie。因此,完成支付并被重定向回原始网站后,由于无法检索原始登录cookie,用户看起来会自动注销,这个包将解决这个问题。

现在您需要调用RecoverSession::preserve()将当前会话ID保存到缓存中,并将键放入您的回调URL中,这样API返回键后可以恢复当前会话。

use Ycs77\LaravelRecoverSession\Facades\RecoverSession;

public function pay(Request $request)
{
    $key = RecoverSession::preserve($request);

    ThirdPartyApi::callbackUrl('/pay/callback?sid='.$key);

    // post form to third-party API...
}

此包将自动从回调URL检索加密的会话ID,并在返回到该站点时恢复原始会话状态。

关于SameSite的参考详细信息:https://developers.google.com/search/blog/2020/01/get-ready-for-new-samesitenone-secure

本地中间件

如果您不使用全局恢复会话,可以将配置recover-session.global设置为true,并调整中间件的顺序,以便将RecoverSession放在StartSession下面。默认情况下,Laravel的Kernel没有$middlewarePriority属性。您可以在Laravel框架中找到它,或者复制以下代码并将其粘贴到app/Http/Kernel.php中。

class Kernel extends HttpKernel
{
    /**
     * The priority-sorted list of middleware.
     *
     * Forces non-global middleware to always be in the given order.
     *
     * @var string[]
     */
    protected $middlewarePriority = [
        \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
        \Illuminate\Cookie\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Ycs77\LaravelRecoverSession\Middleware\RecoverSession::class, // need to place `RecoverSession` below `StartSession`
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
        \Illuminate\Routing\Middleware\ThrottleRequests::class,
        \Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,
        \Illuminate\Contracts\Session\Middleware\AuthenticatesSessions::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];
}

最后,您可以将RecoverSession中间件添加到API的回调路由中。

use Ycs77\LaravelRecoverSession\Middleware\RecoverSession;

Route::post('/pay/callback', [PaymentController::class, 'callback'])
    ->middleware(RecoverSession::class);

赞助商

如果您认为这个包对您有帮助,请考虑成为赞助商以支持我的工作~您的头像将出现在我的主要项目中。

Become a Patron

致谢

许可证

MIT许可证