Laravel 10 JWT API部署CentOS后部分角色路由返回401未授权
问题排查与解决方案
1. 检查ClientAuthenticationController的userInfo方法实现
- 确认方法中是否指定了正确的guard:
若直接使用// 明确指定client guard,避免使用默认guard导致查询错误 public function userInfo() { return response()->json(auth('client')->user()); }auth()->user(),而默认guard并非client,会无法获取到client用户,返回401。 - 排查方法内是否有额外权限校验(如账号活跃状态),比如服务器上的client账号是否被标记为非活跃,而本地测试账号是正常状态。
2. 验证jwt.verify中间件逻辑
确保自定义的jwt.verify中间件正确根据传入的guard参数切换认证guard:
public function handle($request, Closure $next, $guard) { // 切换到指定的guard,保证后续auth()操作使用正确的用户模型 auth()->shouldUse($guard); try { if (!auth()->user()) { return response()->json(['error' => 'Unauthorized'], 401); } } catch (\Exception $e) { return response()->json(['error' => 'Unauthorized'], 401); } return $next($request); }
若中间件未执行shouldUse切换guard,即使token有效,auth()->user()也会用默认guard查询,导致找不到client用户。
3. 检查config/auth.php的guard配置
确认client guard和provider的配置正确:
'guards' => [ // ...其他guard配置 'client' => [ 'driver' => 'jwt', 'provider' => 'clients', ], 'student' => [ 'driver' => 'jwt', 'provider' => 'students', ], ], 'providers' => [ // ...其他provider配置 'clients' => [ 'driver' => 'eloquent', 'model' => App\Models\Client::class, ], 'students' => [ 'driver' => 'eloquent', 'model' => App\Models\Student::class, ], ],
同时清理服务器上的配置缓存,执行以下命令:
php artisan config:clear php artisan route:clear php artisan cache:clear
4. 确认Client模型实现JWTSubject接口
确保Client模型正确实现JWT要求的接口:
use Illuminate\Database\Eloquent\Model; use Tymon\JWTAuth\Contracts\JWTSubject; class Client extends Model implements JWTSubject { // ...模型其他代码 public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; } }
未实现该接口会导致JWT无法正确解析出client用户。
5. 验证JWT Token的Payload
使用jwt.io解析client的token,检查:
sub字段是否对应服务器数据库中存在的client ID;- 本地与服务器的
JWT_SECRET是否一致(查看.env文件),不一致会导致用户解析失败; aud、iss等声明是否与服务器配置匹配。
内容的提问来源于stack exchange,提问作者Ashiq Fardus
相关产品推荐
相关产品推荐

