Laravel多租户应用API路由认证失败问题求助
解决Laravel Tenancy for Laravel租户API Sanctum认证失败问题
以下是针对租户API返回"Unauthenticated."问题的排查和解决步骤:
1. 确认租户User模型已引入HasApiTokens trait
中心用户模型通常已添加该trait,但租户的User模型可能遗漏。打开租户环境下的App\Models\User.php,确保引入并使用:
use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... 其他代码 }
2. 配置租户Sanctum的状态域
复制中心的config/sanctum.php到租户配置目录(config/tenant/sanctum.php),更新stateful配置允许租户域名:
return [ 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' ))), // 其他配置保持不变 ];
同时在.env中添加租户域名:
SANCTUM_STATEFUL_DOMAINS=localhost,foo.localhost,bar.localhost
3. 确保租户路由正确应用中间件
修改routes/tenant.php,为API路由包裹api中间件组,同时给令牌生成路由添加web中间件(确保用户已通过session认证):
// routes/tenant.php // 租户API路由需api中间件支持 Route::middleware('api')->group(function () { require __DIR__.'/tenant/api.php'; }); // 令牌生成路由需web中间件确保session登录状态 Route::middleware('web')->get('/user/issue-token', [UserController::class, 'issueAPIToken'])->name('users.api.token');
4. 验证令牌生成时的租户上下文
在issueToken方法中添加日志,确认当前请求是否处于租户上下文:
public function issueToken() { // 日志记录当前租户与认证用户信息 logger()->info('Current tenant:', ['tenant_id' => tenancy()->tenant?->id]); logger()->info('Authenticated user:', ['user_id' => Auth::id()]); $user = Auth::user(); $token = $user->createToken('authToken')->plainTextToken; return response()->json(['token' => $token], 200); }
如果日志无租户信息,需检查Tenancy包的租户域名识别配置是否正确。
5. 确保租户数据库已执行Sanctum迁移
Sanctum的personal_access_tokens表必须存在于租户数据库中,执行以下命令:
# 先发布Sanctum迁移(未发布过的话) php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider" # 执行租户迁移 php artisan tenants:migrate
6. 检查请求头格式
确认Postman中Authorization头格式正确:
- 头名严格为
Authorization - 值格式为
Bearer+ 令牌(注意Bearer后有一个空格),例如:Bearer 5|jhA....
内容的提问来源于stack exchange,提问作者Maison012
相关产品推荐
相关产品推荐

