Laravel Vue JWT API认证调用api/auth/user时遇token_not_provided错误
嘿,我之前在搭Laravel+Vue的JWT认证时也踩过这个一模一样的坑,给你梳理几个关键排查点,应该能解决你的问题:
排查步骤:
1. 先确认登录接口真的返回了JWT Token
很多时候看起来登录成功,但其实接口根本没生成token。打开你的登录控制器(比如app/Http/Controllers/Auth/LoginController.php),检查核心逻辑是不是像下面这样:
public function login(Request $request) { $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required' ]); // 验证用户凭证并生成token(指定api guard) if (! $token = auth('api')->attempt($credentials)) { return response()->json(['error' => 'Unauthorized'], 401); } // 返回包含token的标准响应 return response()->json([ 'access_token' => $token, 'token_type' => 'Bearer', 'expires_in' => auth('api')->factory()->getTTL() * 60 ]); }
重点要确认:
- 明确使用
auth('api')->attempt()而非默认的web guard - 验证成功后确实返回了
access_token字段
2. 检查请求用户接口时是否正确携带Token
JWT默认要求通过Authorization请求头携带Token,格式是Bearer 你的token字符串。
- 如果是前端Vue项目,要确保请求拦截器正确添加了这个头,比如用axios的话:
// 在axios配置中添加请求拦截器 axios.interceptors.request.use(config => { const token = localStorage.getItem('auth_token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; });
- 如果用Postman测试,直接在
Headers标签里添加键Authorization,值填Bearer 你的token内容
3. 验证Laravel的Auth配置是否正确
打开config/auth.php,确保api guard的driver设置为jwt:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'jwt', // 这里必须是jwt,不能是session 'provider' => 'users', ], ],
同时确认你的/api/auth/user路由使用了auth:api中间件:
// routes/api.php Route::middleware('auth:api')->get('/auth/user', function (Request $request) { return $request->user(); });
4. 排查是否有中间件干扰Token传递
有时候全局中间件会影响请求头,比如EncryptCookies或者VerifyCsrfToken,但api路由默认是不包含这些中间件的。检查app/Http/Kernel.php的$middlewareGroups里的api组:
protected $middlewareGroups = [ 'web' => [ // web路由的中间件,包含session、csrf等 ], 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
确保api组里没有添加多余的中间件(比如session相关的),因为JWT是无状态认证,不需要依赖session。
5. 确认用户密码是正确哈希存储的
如果用户创建时密码没有用Hash::make()加密,auth()->attempt()会验证失败,导致生成不了token。比如注册控制器里的逻辑:
public function register(Request $request) { $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), // 必须用Hash加密密码 ]); // ...其他注册逻辑 }
按照上面的步骤逐一排查,应该能快速定位到问题所在。
内容的提问来源于stack exchange,提问作者wafutech
相关产品推荐
相关产品推荐

