升级tymon/jwt-auth至0.5.*后,如何通过请求Token获取用户?
解决tymon/jwt-auth 0.5.*版本中Token验证API失效的问题
你遇到的问题核心是新版本的API变更+中间件未正确启用导致的,咱们一步步来修复:
1. 先启用auth:api中间件
你现在注释掉了控制器的中间件,这是auth()->user()返回空的根本原因——框架没有自动处理Token的验证和用户绑定。把注释去掉,根据你的需求设置不需要验证的方法:
class UserController extends Controller { public function __construct() { // 如果这个控制器里有不需要验证的方法(比如login),就添加到except数组里 $this->middleware('auth:api', ['except' => []]); } // ... 其他方法 }
启用中间件后,只要请求携带了有效的Token(默认支持请求头Authorization: Bearer {token}、请求参数token、Cookie这几种传递方式),中间件会自动验证Token,并将用户实例绑定到auth()助手函数中,这时候auth()->user()就能正常获取用户了。
2. 替换已弃用的JWTAuth::toUser()方法
在0.5.*版本中,JWTAuth::toUser()已经被移除了。如果因为特殊场景需要手动处理Token(不推荐,中间件是更规范的实现方式),可以用parseToken()->authenticate()替代:
public function enterWorld(Request $request) { try { // 解析请求中的Token并验证合法性 $user = JWTAuth::parseToken()->authenticate(); } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) { // 处理Token无效/不存在的异常 return response()->json(['error' => 'Invalid or missing token'], 401); } return response()->json($user); }
3. 确认用户模型的必要实现
升级后要确保你的用户模型实现了JWTSubject接口,这是新版本的强制要求:
use Illuminate\Foundation\Auth\User as Authenticatable; use Tymon\JWTAuth\Contracts\JWTSubject; class User extends Authenticatable implements JWTSubject { // ... 你的模型原有代码 // 实现JWTSubject接口的两个必填方法 public function getJWTIdentifier() { return $this->getKey(); // 返回用户主键ID } public function getJWTCustomClaims() { return []; // 可在这里添加自定义JWT声明,比如用户角色、权限等 } }
最后验证
现在测试enterWorld接口:
- 携带登录时获取的
token(推荐放在Authorization: Bearer {token}请求头里,更符合REST规范) - 请求后应该能正常返回用户信息,而不是空数组了
内容的提问来源于stack exchange,提问作者TheUnreal
相关产品推荐
相关产品推荐

