sanctum 默认使用 personal_access_tokens 表存储令牌,关键字段包括 tokenable_type、tokenable_id、name、token(哈希值,不可逆)、abilities(json 数组)和 expires_at(可为空);token 字段为 sha-256 加盐哈希,明文仅首次生成时返回,数据库中无法直接查看原始值。

Token表结构和字段含义必须先看懂
Sanctum 默认使用 personal_access_tokens 表存 Token,不是你手动建的,而是迁移生成的。它有这些关键字段:tokenable_type(通常是 App\Models\User)、tokenable_id(对应用户 ID)、name(Token 名称,比如 “iOS App”)、token(哈希后的值,**不可逆,不显示明文**)、abilities(JSON 数组,如 ["view", "edit"])、expires_at(可为空,设了才过期)。
在 phpMyAdmin 里直接查这个表时,别指望看到原始 Token 字符串——token 字段是 SHA-256 + 随机 salt 的哈希值,Laravel 写入前就处理过了。你只能通过 name 和 tokenable_id 定位某用户的某个 Token。
删除失效或冗余 Token 要按条件操作
用户反复登录、换设备、重命名 Token,会导致表里堆积大量旧记录。phpMyAdmin 中删 Token 不能靠猜,得用明确条件:
- 删某个用户所有 Token:
DELETE FROM personal_access_tokens WHERE tokenable_type = 'App\Models\User' AND tokenable_id = 123; - 删某名称的所有 Token(比如清理测试用的 “postman-test”):
DELETE FROM personal_access_tokens WHERE name = 'postman-test'; - 删已过期的 Token(注意:
expires_at 仅对设置了过期时间的生效;没设 <code>expires_at的永远不过期):DELETE FROM personal_access_tokens WHERE expires_at IS NOT NULL AND expires_at
执行前务必备份该表,或者先用 SELECT 确认范围。误删 tokenable_id 对应的全部 Token,会导致用户当前所有客户端登出。
手动插入 Token 无法绕过 Sanctum 的签名逻辑
有人想在 phpMyAdmin 里直接 INSERT 一条新 Token 记录来“快速授权”,这行不通。Sanctum 的 token 字段不是随便填的字符串,它由 Hash::make($plainToken) 生成,且创建时还会绑定 tokenable_id 和 abilities 的序列化校验逻辑。你手插一条,哪怕字段全对,Laravel 也验证失败,返回 401 Unauthorized。
正确做法只有两种:
- 用 Laravel Tinker 手动调用:
User::find(123)->createToken('web', ['view']); - 走 Sanctum 提供的 API 接口(POST /login),让框架自己生成并返回明文 Token(仅首次可见)
phpMyAdmin 只能查、删、改 name 或 expires_at 这类非核心字段,改 token 或 abilities 字段内容极易导致验证异常。
搜索和筛选 Token 时注意大小写与 JSON 格式
在 phpMyAdmin 的搜索栏或 SQL 查询中,abilities 是 JSON 字符串,比如 ["view", "update"]。直接用 LIKE '%view%' 可能匹配到错误结果(如 "preview")。更稳妥的是用 MySQL 8.0+ 的 JSON 函数:
SELECT * FROM personal_access_tokens WHERE JSON_CONTAINS(abilities, '"view"');
另外,tokenable_type 默认是完整类名,含命名空间,大小写敏感。搜 App\Models\User 不能写成 app\models\user;如果项目用了自定义模型路径(比如 App\User),字段值也会不同,得先查清楚实际存的是什么。
真正麻烦的不是操作本身,而是 Token 生效依赖整个 Sanctum 中间件链和数据库一致性——比如你清空了表,但 Redis 缓存了某些状态,或前端还拿着旧 Token 请求,错误表现可能延迟出现。动手前,确认当前环境没启用缓存 Token 验证的中间件变体(比如自定义的 EnsureTokenIsValid)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











