Livewire 会话在 Laravel 身份验证中间件中返回 NULL

时间:2021-04-26 05:31:04

标签: laravel session jwt

我有一个需要使用 JWT 发送请求的 livewire 组件。

由于 livewire GET 请求默认不发送令牌,我决定修改 Laravel 的身份验证中间件,以便通过 Laravel Auth 中间件中的承载发送我在 livewire 组件中放入会话的令牌.

我在 livewire 组件中添加到会话的变量,当我尝试在身份验证中间件中检索它时返回 NULL。

1.Livewire 组件

<?php

namespace App\Http\Livewire;
class HelloWorld extends Component
{
    public function mount(TransactionCheckoutRequest $request)
    {
        session(['x__livewire__token' => 'put token in session' ]);
    }
}

2.Laravel 身份验证中间件

<?php

namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Facades\Cookie;

class Authenticate extends Middleware
{
    public function handle($request, Closure $next, ...$guards)
    {
        # Check if request is made using LIVEWIRE
        if ( request()->hasHeader('x-livewire') ) {

            /**
             * get token from session
             *
             * 
             * But, this $token return NULL
             * instead token value.
             */
            $token = session()->get('x__livewire__token');

            $request->headers->set('Accept', 'application/json');
            $request->headers->set('Content-Type', 'application/json');

            // # Send token to request header
            $request->headers->set('Authorization', 'Bearer ' . $token);
        }

        # After that, authenticate livewire request
        $this->authenticate($request, $guards);

        return $next($request);
    }


    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if ( !$request->expectsJson() ) {
            return route('user.login');
        }
    }
}

3.Web路由文件

<?php

Route::group(['prefix' => 'v1'], function() {
        
    Route::group(['middleware' => ['auth:api', 'jwt.verifyer', 'hostname.access.verifyer']], function() {
        
        # Here is LIVEWIRE component
        Route::get('/processing', HelloWorld::class)->name('transaction.checkout');
    });

});

有人可以解释我应该如何扩展中间件以使用令牌吗?

0 个答案:

没有答案