Laravel 5.5用jwt-auth实现API注册登录遇Token Not Provided错误求助
我来帮你排查这个头疼的问题,结合你的代码和Laravel 5.5搭配jwt-auth的常见坑,咱们一步步定位解决:
1. 先确认后续请求的Token传递方式是否正确
这是最常见的触发原因!jwt-auth默认要求Token必须放在Authorization请求头里,格式严格为:
Bearer {你的token字符串}
很多人容易踩的坑:
- 直接把token字符串塞进
Authorization头,漏掉了Bearer前缀 - 把token放在请求体(比如单独的
token字段)或者URL参数里,而非指定的请求头 - 前端跨域请求时,没配置允许传递自定义
Authorization头
你可以用Postman快速测试:在请求头里添加Authorization,值填Bearer 你登录返回的token,再访问需要验证的接口,看是否还报错。
2. 检查JWT的Guard和中间件配置
验证config/auth.php的API Guard配置
确保api guard的驱动是jwt,而非默认的token:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'jwt', // 必须设置为jwt 'provider' => 'users', ], ],
确认路由是否正确应用了auth:api中间件
需要身份验证的API路由,必须包裹在auth:api中间件组内,比如:
Route::group(['middleware' => 'auth:api'], function () { // 这里放需要验证的接口,比如用户信息、订单查询等 Route::get('/user/profile', 'UserController@profile'); });
如果没加这个中间件,或者误加为auth(默认对应web guard),会导致Token验证逻辑失效。
3. 检查登录代码的Credentials字段问题
看你的登录代码:
$credentials = $request->only('username', 'password');
但注册时你用的是email作为用户标识,你的User模型默认认证字段应该是email吧?如果数据库里没有username字段,这里得改成email才能生成有效Token:
$credentials = $request->only('email', 'password');
虽然这个问题不会直接触发「Token Not Provided」,但如果登录生成的Token无效,后续请求也会出现类似验证错误。
4. 确认jwt-auth的核心配置
检查config/jwt.php里的关键配置项:
'token_header' => 'Authorization', // 必须是Authorization 'token_prefix' => 'Bearer', // 必须是Bearer,注意后缀有空格
如果这些配置被修改过,jwt-auth就无法识别你传递的Token。
额外提醒:注册时密码要哈希
看你的注册代码里$this->user->registerUser(),一定要确保注册时密码是用Hash::make()哈希过的——因为JWTAuth::attempt()需要匹配哈希后的密码才能生成Token,否则登录会返回「Invalid credentials!」。
按照上面的步骤排查,应该就能解决「Token Not Provided」的问题了!
内容的提问来源于stack exchange,提问作者syed1234

