ycs77 / laravel-recover-session
当表单从第三方API返回时恢复Laravel会话。
v1.2.0
2023-06-20 09:48 UTC
Requires
- php: >=8.1
- illuminate/cache: >=9.0
- illuminate/config: >=9.0
- illuminate/contracts: >=9.0
- illuminate/encryption: >=9.0
- illuminate/http: >=9.0
- illuminate/session: >=9.0
- illuminate/support: >=9.0
- symfony/http-foundation: >=6.0
Requires (Dev)
- mockery/mockery: ^1.4
- orchestra/testbench: >=7.0
- pestphp/pest: ^2.6
README
当表单从第三方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);
赞助商
如果您认为这个包对您有帮助,请考虑成为赞助商以支持我的工作~您的头像将出现在我的主要项目中。