Laravel 和 jwt 代币。JWTException 原因不明

Laravel and jwt token . JWTException for unknown reason

提问人:Ahmed Ajajeh 提问时间:11/17/2023 最后编辑:Ahmed Ajajeh 更新时间:11/17/2023 访问量:42

问:

我正在建立一个药品仓库管理系统。我遇到了需要使用 jwt 令牌来应用身份验证的情况。

我应该经过身份验证的对象的模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class Pharmacist extends Authenticatable implements JWTSubject
{
    use HasFactory;
    use \Illuminate\Auth\Authenticatable;
    
    protected $table = 'pharmacists';
    protected $fillable = ['name_ar', 'name_en', 'phone_number', 'password', 'pharmacy_name_ar', 'pharmacy_name_en', 'status', 'email', 'location_id'];


    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

代币生成方法:

$token = JWTAuth::fromUser($pharmacist, ['isAdmin' => false]);

其中 $pharmacist 是药剂师模型的对象。

midlleware如下:


use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\Response;
use Tymon\JWTAuth\Facades\JWTAuth;

class isAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {

        try {
            $token = $request->header('Authorization');
            $token = str_replace('Bearer ', '', $token);

            $user = JWTAuth::toUser($token);

            $payload = JWTAuth::getPayload($token)->toArray();
            $isAdmin = $payload['isAdmin'] ?? null;

            if ($isAdmin) {
                $request->merge(['admin' => $user]);
            } else {
                $request->merge(['pharmacist' => $user]);
            }

            return $next($request);
        } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
            return response()->json(['error' => 'Token expired'], 401);
        } catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
            return response()->json(['error' => 'Token invalid'], 401);
        } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
            return response()->json(['error' => 'Token absent'], 401);
        }

    }
}

问题是它总是返回“'Token absent'”的响应,这意味着它是一个 JWTException。尽管 $token var 的值是正确的。问题可能出在哪里?

请注意,我已经删除了创建 laravel 项目时自动生成的 User 模型。这与我的问题有关吗?

排出是从 $token->toUser() 方法抛出的。

异常的日志如下: Tymon\JWTAuth\Exceptions\JWTException:C:\X\BackEnd\vendor\tymon\jwt-auth\src\JWT.php:318 中需要令牌

vendor\tymon\jwt-auth\src\JWT.php(192):Tymon\JWTAuth\JWT->requireToken()。

vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php(353): Tymon\JWTAuth\JWT->getPayload('eyJ0eXAiOiJKV 1Q...')。

并继续: BackEnd\public\index.php(51):Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))

任何帮助都会被理解。谢谢。

PHP Laravel 令牌 Tymon-JWT

评论

0赞 Lajos Arpad 11/28/2023
你能指出哪一行从你共享的代码中抛出异常吗?
0赞 Lajos Arpad 11/28/2023
结果是什么?$request->header('Authorization')

答: 暂无答案