Laravel 8 API:无需路由Auth中间件,控制器内验证用户有效Token
在Laravel 8中手动检查JWT Token有效性(无需Auth中间件)
你的代码直接调用auth('api-web-app')->check()返回false,核心原因是Auth门面的check()方法不会自动解析请求中的Token——路由Auth中间件会自动完成「提取Token→验证→加载用户」的流程,但手动调用时需要你自己触发这个逻辑。
下面是修正后的实现方案:
方案一:自动解析并验证Token
利用JWT Guard内置的方法自动处理Token提取和验证,适配标准的Authorization: Bearer {token}请求头格式:
use Tymon\JWTAuth\Exceptions\TokenExpiredException; use Tymon\JWTAuth\Exceptions\TokenInvalidException; protected function isAuthenticated() { $guard = auth('api-web-app'); try { // parseToken自动提取请求中的Token,authenticate完成验证并加载用户 if ($guard->parseToken()->authenticate()) { Log::info('Token有效,用户已认证'); return true; } } catch (TokenInvalidException $e) { Log::info('无效的Token'); } catch (TokenExpiredException $e) { Log::info('Token已过期'); } catch (\Exception $e) { Log::info('Token认证失败: ' . $e->getMessage()); } Log::info('未通过Token认证'); return false; }
关键注意事项
- 依赖验证:确保已正确安装并初始化
tymon/jwt-auth包,auth.php中api-web-appguard的driver设置为jwt。 - Provider配置:确认
customers用户提供者能正确从数据源(如数据库)获取对应的用户模型。 - 异常区分:捕获不同类型的JWT异常,可针对性处理过期、无效、缺失Token等场景。
方案二:自定义Token提取逻辑
如果你的Token通过非标准方式传递(比如自定义请求头X-Token),可以手动提取后再验证:
use Tymon\JWTAuth\Exceptions\TokenExpiredException; use Tymon\JWTAuth\Exceptions\TokenInvalidException; protected function isAuthenticated() { $guard = auth('api-web-app'); // 从自定义请求头获取Token $token = $this->request->header('X-Token'); if (!$token) { Log::info('未找到Token'); return false; } try { $guard->setToken($token); $user = $guard->authenticate(); $guard->setUser($user); Log::info('Token有效,用户已认证'); return true; } catch (TokenInvalidException $e) { Log::info('无效的Token'); } catch (TokenExpiredException $e) { Log::info('Token已过期'); } catch (\Exception $e) { Log::info('Token认证失败: ' . $e->getMessage()); } return false; }
内容的提问来源于stack exchange,提问作者Čamo
相关产品推荐
相关产品推荐

