Laravel 8 Passport API线上服务器出现Unauthenticated错误求助
针对你遇到的本地正常、线上CentOS服务器Token生成正常但认证失败的问题,可按以下步骤排查解决:
1. 确保线上已生成Passport加密密钥
线上部署时必须执行Passport安装命令生成密钥文件,否则无法解析Token:
php artisan passport:install
执行完成后,检查storage目录下是否存在oauth-private.key和oauth-public.key,并确保这两个文件的权限正确(赋予Web服务器用户读写权限,比如针对Nginx:chown nginx:nginx storage/oauth-*.key)。
2. 修复Nginx的Authorization头传递问题
CentOS常用的Nginx默认会丢弃Authorization请求头,导致Passport无法获取Token。在你的站点Nginx配置中添加以下规则:
location / { try_files $uri $uri/ /index.php?$query_string; # 确保Authorization头传递到PHP fastcgi_param HTTP_AUTHORIZATION $http_authorization; }
修改后重启Nginx服务:
systemctl restart nginx
3. 验证服务器是否接收到Authorization头
添加一个临时测试接口,确认请求头是否正确传递:
// 在api.php中添加 Route::get('/test-auth', function(\Illuminate\Http\Request $request) { dd($request->header('Authorization'), $_SERVER); });
用Postman携带Bearer Token调用该接口,查看输出中是否包含Authorization字段。如果没有,说明Web服务器配置仍有问题,需重新调整。
4. 排查SELinux权限限制
CentOS 8默认开启SELinux,可能会阻止Laravel读取Passport密钥或写入日志。临时关闭SELinux测试:
setenforce 0
如果关闭后认证正常,说明是SELinux权限问题,给Laravel的storage目录添加正确的SELinux上下文:
chcon -R -t httpd_sys_rw_content_t /var/www/website/storage
5. 确认APP_KEY配置正确
如果线上.env文件中的APP_KEY与本地不一致,会导致Token解析失败。检查线上APP_KEY,若不一致,重新生成后需再次执行php artisan passport:install。
6. 检查Passport中间件配置
确认app/Http/Kernel.php的$routeMiddleware中已正确注册Passport的中间件:
protected $routeMiddleware = [ // 其他中间件... 'auth:api' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class, ];
内容的提问来源于stack exchange,提问作者Kin

