Laravel 10.x中Laravel Sanctum用户令牌认证配置问题求助
Laravel Sanctum 令牌认证401问题排查与解决
核心问题分析
你的配置和代码存在以下关键错误,导致令牌认证失效:
- API Guard 驱动配置错误:使用Session驱动而非Sanctum专属驱动,无法识别Bearer令牌
- User模型缺少Sanctum令牌支持的必要Trait
- 代码中残留旧版API令牌的冗余逻辑
- 更新接口的验证规则存在逻辑漏洞
分步解决方案
1. 修正config/auth.php的Guard配置
将API Guard的驱动改为sanctum,这是Sanctum识别令牌的核心配置:
'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ], 'guards' => [ 'api' => [ 'driver' => 'sanctum', // 替换原来的session 'provider' => 'users', ], ],
2. 给User模型添加Sanctum令牌支持Trait
打开App\Models\User.php,引入并使用HasApiTokens trait:
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; // 引入该Trait class User extends Authenticatable { use HasApiTokens, Notifiable; // 添加到Trait列表中 // ... 其他原有代码 }
这个Trait是生成和验证Sanctum令牌的必要条件。
3. 清理UserController中的冗余代码
- Store方法:移除手动生成
api_token的代码(Sanctum无需此字段,令牌存储在personal_access_tokens表),同时给令牌名称设置默认值:
$user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), // 删除此行:'api_token' => Str::random(60), ]); // ... 其他代码 $token = $request->user()->createToken($request->token_name ?? 'auth_token');
- Update方法:修复两个问题:
- 密码需加密存储,不能直接存明文
- 邮箱验证需排除当前用户,否则更新时会触发唯一约束错误
public function update(Request $request) { $user = $request->user(); $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:' . User::class . ',' . $user->id], 'password' => ['required', 'confirmed', Rules\Password::defaults()], ]); $user->name = $request->name; $user->email = $request->email; $user->password = Hash::make($request->password); // 增加密码加密 $user->save(); return $user; }
4. 验证Sanctum迁移与数据库
确保已执行Sanctum的迁移命令,生成personal_access_tokens表:
php artisan migrate
若之前未安装Sanctum,先执行安装命令:
composer require laravel/sanctum php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
5. 接口调用规范
调用需要认证的接口(user/update)时,必须在请求头中携带令牌:
Authorization: Bearer 你的令牌字符串
测试流程
- 调用
/api/register或/api/login获取Bearer令牌 - 用Scramble/Postman等工具,在请求头添加
Authorization字段,令牌前缀为Bearer - 调用
/api/user,应返回当前用户信息,不再返回401错误
内容的提问来源于stack exchange,提问作者Gemberkoekje
相关产品推荐
相关产品推荐

