提问人:Ahmed Ajajeh 提问时间:11/17/2023 最后编辑:Ahmed Ajajeh 更新时间:11/17/2023 访问量:42
Laravel 和 jwt 代币。JWTException 原因不明
Laravel and jwt token . JWTException for unknown reason
问:
我正在建立一个药品仓库管理系统。我遇到了需要使用 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))
任何帮助都会被理解。谢谢。
答: 暂无答案
评论
$request->header('Authorization')