Laravel与API Platform集成时Sanctum认证失败问题排查
问题描述
我正在尝试使用全新的Laravel API Platform集成。我有一个运行在Laravel Herd上的Jetstream/Sanctum应用,配置如下:
.env 配置
APP_URL=https://api.immo.test SANCTUM_STATEFUL_DOMAINS=api.immo.test SESSION_DOMAIN=.immo.test
config/api-platform.php 配置
'defaults' => [ 'route_prefix' => '/api', 'middleware' => ['auth:sanctum'], ],
模型定义
#[ApiResource] class Property extends Model
OpenAPI文档可正常访问(地址:https://api.immo.test/api/),但调用/api/properties这类资源路由时始终出现认证错误,通过Laravel Telescope查看发现用户身份无法被识别。异常追踪片段如下:
{ "trace": [ { "file": "/Volumes/Work/Code/imapi/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php", "line": 88, "function": "unauthenticated", "class": "Illuminate\\Auth\\Middleware\\Authenticate", "type": "->" }, { "file": "/Volumes/Work/Code/imapi/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php", "line": 62, "function": "authenticate", "class": "Illuminate\\Auth\\Middleware\\Authenticate", "type": "->" }, { "file": "/Volumes/Work/Code/imapi/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", "line": 183, "function": "handle", "class": "Illuminate\\Auth\\Middleware\\Authenticate", "type": "->" }, { "file": "/Volumes/Work/Code/imapi/vendor/api-platform/laravel/ApiPlatformMiddleware.php", "line": 47, "function": "Illuminate\\Pipeline\\{closure}", "class": "Illuminate\\Pipeline\\Pipeline", "type": "->" }, ... ], "type": "/errors/401", "title": "An error occurred", "status": 401, "detail": "Unauthenticated." }
我的其他基于Sanctum的应用路由可正常工作,例如:
Route::middleware('auth:sanctum')->group(function () { Route::get('user', fn () => request()->user()); });
解决方法
- 检查API Platform中间件顺序:确保
auth:sanctum中间件在API Platform核心中间件之前执行。可在config/api-platform.php中调整全局中间件顺序,或在模型的#[ApiResource]注解里明确指定中间件优先级。 - 确认认证头传递正确:调用API时必须携带
Authorization: Bearer {token}请求头,且token有效。在API Platform的OpenUI文档页面,需配置Bearer token认证方式,否则测试请求不会自动携带token。 - 检查模型注解的中间件覆盖:如果
#[ApiResource]注解单独指定了中间件,会覆盖全局配置。需确保注解中的中间件配置包含auth:sanctum,示例:#[ApiResource(middleware: ['auth:sanctum'])] - 清除配置缓存:执行以下命令确保最新配置生效:
php artisan config:clear php artisan route:clear - 验证Sanctum状态域配置:尝试将
SANCTUM_STATEFUL_DOMAINS设置为.immo.test,覆盖整个域名后缀,避免子域名匹配问题。
内容的提问来源于stack exchange,提问作者ndberg
相关产品推荐
相关产品推荐

