laravel sanctum 在 php 8.2 中配置需五步:安装包并发布迁移、执行 php artisan migrate 创建 personal_access_tokens 表、user 模型引入 hasapitokens、config/auth.php 中 api guard 驱动设为 sanctum、api 路由使用 auth:sanctum 中间件,登录后调用 $user->createtoken()->plaintexttoken 返回令牌,前端通过 authorization: bearer 头传递。

在 PHP 8.2 中配置 Laravel Sanctum 令牌认证,核心是确保 Laravel 版本兼容(建议 ≥ 9.21 或 10.x)、正确安装 Sanctum、发布并迁移数据库表、配置中间件与 API 路由,并安全生成/验证 Token。以下为清晰、可落地的操作步骤。
确认环境与依赖
Laravel Sanctum 官方支持 Laravel 9+ 和 PHP 8.0+,PHP 8.2 完全兼容。需确保:
- 已安装 Laravel 9.21+ 或 Laravel 10.x(推荐 Laravel 10.42+,对 PHP 8.2 优化更完善)
- Composer 已更新至 2.5+(避免包加载异常)
- 项目未残留旧版 Passport 或其他 Token 认证中间件冲突
安装与初始化 Sanctum
执行以下命令安装 Sanctum 并发布配置与迁移文件:
composer require laravel/sanctum php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
这会生成 config/sanctum.php 和数据库迁移文件 database/migrations/xxx_create_personal_access_tokens_table.php。接着运行:
php artisan migrate
该迁移创建 personal_access_tokens 表,用于存储 API Token(注意:它不存密码,只存 token_hash、abilities、expires_at 等)。
配置模型与认证守卫
在 app/Models/User.php 中添加 HasApiTokens trait:
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, ...;
}
在 config/auth.php 的 guards 中确保定义了 sanctum 守卫(Laravel 10 默认已存在):
'sanctum' => [
'driver' => 'sanctum',
'provider' => 'users',
],
若使用 API 路由,还需确认 api guard 使用的是 sanctum(而非 token):
'api' => [
'driver' => 'sanctum',
'provider' => 'users',
],
设置 API 路由与中间件
在 routes/api.php 中定义受保护路由,使用 auth:sanctum 中间件:
use Illuminate\Http\Request;
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
生成 Token 示例(如登录后):
$token = $user->createToken('API Token')->plainTextToken;
// 返回给前端(仅首次显示,之后用 Bearer Token 请求)
前端请求时需在 Header 中携带:
Authorization: Bearer {your_token_here}
注意:Sanctum 默认不加密存储 Token 明文,plainTextToken 是 Base64 编码的随机字符串(长度 40+),服务端只比对哈希值,安全可靠。
常见问题处理
若遇到 401 Unauthenticated:
- 检查请求 Header 是否含
Authorization: Bearer xxx,且 token 未过期(默认永不过期,除非调用expiresAt()) - 确认数据库中
personal_access_tokens表的tokenable_type是App\Models\User(Laravel 10 默认使用完整命名空间) - 若用 Nginx/Apache,确保转发了
Authorization头(Apache 需RewriteCond %{HTTP:Authorization} .+;Nginx 需fastcgi_pass_request_headers on;)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











