Laravel Passport部署到cPanel后带Token的API路由跳转至登录页问题
问题排查方案
针对你部署到cPanel后API路由认证失败跳转至登录路由的问题,可按以下步骤排查:
1. 修正API认证失败的响应逻辑
Laravel默认对非JSON请求的认证失败会跳转登录页,若你的API请求未被识别为JSON请求,就会触发跳转至api/user/login(该路由仅支持POST,GET访问自然报错)。
- 检查
app/Exceptions/Handler.php中的unauthenticated方法,确保API请求返回JSON而非跳转:
use Illuminate\Auth\AuthenticationException; protected function unauthenticated($request, AuthenticationException $exception) { if ($request->expectsJson()) { return response()->json(['message' => '未授权访问'], 401); } return redirect()->guest(route('login')); }
- 同时在Postman请求中添加
Accept: application/json请求头,明确告知服务器这是API请求。
2. 确保Passport在服务器环境的配置完整
- 执行
php artisan passport:keys生成服务器专属的加密密钥(本地的keys文件不会自动同步到服务器,必须重新生成)。 - 确认
.env文件中APP_URL设置为服务器的完整域名(如https://your-domain.com),Passport生成的Token依赖该URL验证有效性。 - 检查服务器数据库中
oauth_clients、oauth_personal_access_clients表是否有有效数据,若为空则重新执行php artisan passport:install。
3. 验证权限Gate的执行结果
你的admin Gate依赖用户关联的role模型及title字段,需确认服务器数据库数据是否正确:
- 执行
php artisan tinker进入交互模式,输入以下命令验证:
$user = App\Models\User::find(你的用户ID); dd($user->role, $user->can('admin'));
若返回false,说明用户的role关联不存在或title不是admin,需修正数据库数据。
4. 彻底清除路由缓存
执行以下命令确保路由缓存被完全清除:
php artisan route:clear php artisan config:clear php artisan cache:clear
注意:不要在生产环境执行php artisan route:cache,除非你确认所有路由都是静态定义的,否则会导致动态路由失效。
5. 检查请求头的正确性
- 确认
Authorization头格式为Bearer {你的Token},注意Bearer与Token之间必须有空格。 - 若服务器启用HTTPS,需确保请求使用HTTPS协议,避免Token因协议不一致验证失败。
6. 单独测试中间件定位问题
暂时移除can:admin中间件,仅保留auth:api,测试API是否能正常访问:
Route::middleware(['auth:api'])->group(function () { Route::get('card/index',[CardController::class, 'index']); });
若此时能正常访问,说明问题出在权限Gate的判断逻辑;若仍跳转登录,则问题集中在auth:api认证环节。
内容的提问来源于stack exchange,提问作者Jack The Baker
相关产品推荐
相关产品推荐

