Laravel 5.6集成Passport后API接口返回401未授权求助
看起来你已经按官方步骤走完了Passport的安装流程,但还是遇到了API路由返回401的问题,我来帮你梳理几个常见的排查点和解决办法:
先确认你已完成的配置(方便对照)
你提到的步骤我再整理下,确保没有遗漏:
- 通过Composer安装了Laravel Passport
- 执行了
php artisan passport:install生成加密密钥和客户端 - 在
User模型中添加了HasApiTokenstrait - 在
AuthServiceProvider的boot方法中注册了Passport::routes() - 修改了
config/auth.php的provider配置 - 在web中间件组中加入了
CreateFreshApiToken中间件
你的路由配置和请求头我也看过了,下面是具体的排查方向:
1. 检查config/auth.php的API Guard配置是否正确
这是最容易出错的点之一!确保api guard的driver设置为passport,而不是默认的token。正确的配置应该是这样:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', // 这里必须是passport,不是token! 'provider' => 'users', ], ],
如果只是改了provider没改driver,Passport根本不会参与API的身份验证,自然会返回401。
2. 确认CreateFreshApiToken中间件的顺序
你已经把这个中间件加到了web组,但它必须放在StartSession中间件之后,因为它需要依赖会话来生成有效的API token。Laravel默认的web中间件组顺序应该是:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // 这里放CreateFreshApiToken,不能在StartSession前面 \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
顺序错了的话,中间件无法获取到会话信息,生成的token自然无效。
3. 验证请求中的Token和Cookie是否有效
从你的请求头来看,你是通过前端web会话访问API的(带有laravel_session和X-XSRF-TOKEN),这时候需要:
- 确保前端正确读取了
XSRF-TOKENcookie,并在请求头中发送了X-XSRF-TOKEN(你已经做到了,这点没问题) - 清除浏览器的缓存和所有Laravel相关的cookie,然后重新登录试试——有时候过期或签名错误的cookie会导致验证失败
- 检查
laravel_tokencookie是否存在且有效,这个是CreateFreshApiToken生成的用于API验证的cookie
4. 确认User模型的HasApiTokens trait正确引入
别小看这个细节,很多人会忘记在类中使用这个trait:
use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use HasApiTokens, Notifiable; // 必须包含HasApiTokens! // ... 其他模型代码 }
没有这个trait,Passport无法为用户关联token记录,验证自然通不过。
5. 检查Passport迁移是否成功执行
php artisan passport:install会自动运行迁移,但有时候可能因为权限或其他原因没执行。你可以手动运行:
php artisan migrate
然后检查数据库中是否存在oauth_clients、oauth_access_tokens、oauth_auth_codes这些Passport相关的表。如果没有,说明迁移失败,需要排查迁移文件的问题。
6. 极端情况:重新生成APP密钥
如果你的APP_KEY被修改过,可能会导致Passport的token签名验证失败。可以尝试:
php artisan key:generate
然后重新执行php artisan passport:install——注意这会重置所有现有的客户端和token,生产环境要谨慎操作。
7. 临时调试:在控制器中打印验证信息
你可以在ChatController@store方法开头加一行调试代码,看看是否能获取到用户:
public function store(Request $request) { dd(auth('api')->user()); // 输出当前通过api guard验证的用户 // ... 其他代码 }
如果输出null,说明验证确实没通过,回到前面的步骤排查;如果能输出用户信息,那可能是控制器里的其他逻辑导致的问题。
先从这些点开始排查,应该能解决大部分401的问题。
内容的提问来源于stack exchange,提问作者John Freedom

