oauth_clients表中通过personal_access_client、password_client和revoked三个布尔字段区分客户端类型与状态:personal_access_client=1用于个人访问令牌,password_client=1用于密码授权模式,revoked=1表示已禁用。

直接查 oauth_clients 表,但注意 Laravel Passport 的客户端类型区分
PHPMyAdmin 里看不到“授权客户端”这个专门视图,所有客户端数据都存在 oauth_clients 表中。Laravel Passport 不会为“已授权”和“未授权”客户端分表或加特殊字段——它靠 personal_access_client、password_client 和 revoked 这三个布尔字段来区分用途和状态。
常见误区是以为“授权成功后会有新记录”,其实用户首次用密码模式(password grant)登录时,Laravel 并不写新客户端,而是复用已存在的 password_client 记录生成 token;而个人访问令牌(Personal Access Token)对应的是 personal_access_client 类型的客户端。
-
personal_access_client = 1:用于createToken()生成的个人令牌(如 API 调试用) -
password_client = 1:用于oauth/token接口处理用户名密码登录(Laravel 自带的密码授权端点) -
revoked = 1表示该客户端已被禁用(比如你执行过php artisan passport:client --revoke)
过滤出真正“被用户授权过”的客户端?没有直接字段,得关联查 oauth_auth_codes 或 oauth_access_tokens
“授权客户端记录”在数据库层面不是独立实体,而是授权行为的结果。如果你想知道哪个客户端曾经被用户点过“授权”,得看它是否产生过授权码或访问令牌。
最轻量的验证方式是检查 oauth_auth_codes 表中 client_id 是否存在非空且未过期的记录(expires_at > NOW()),但这只适用于授权码模式(Authorization Code Grant),而 Laravel Passport 默认不启用该模式(除非你手动配置并启用)。
- 绝大多数 Laravel Passport 项目只用密码模式或个人令牌,所以
oauth_auth_codes表常为空 - 更现实的做法是查
oauth_access_tokens表,按client_id分组统计最近 7 天的有效 token 数:SELECT client_id, COUNT(*) as token_count FROM oauth_access_tokens WHERE expires_at > NOW() GROUP BY client_id ORDER BY token_count DESC;
- 注意
oauth_access_tokens.client_id是外键,指向oauth_clients.id,但可能为NULL(比如个人令牌有时不绑定具体客户端)
别漏掉 providers 字段——多租户或自定义 provider 下客户端可能被隔离
Laravel Passport 支持多用户表(比如 users 和 admins),通过 providers 字段指定所属模型。如果你的 auth.php 配置了多个 guard 或自定义 provider,oauth_clients.providers 可能是 "admins" 或其他字符串,而非默认的 "users"。
这意味着:同一个客户端 ID,在不同 provider 下可能是不同逻辑主体。在 PHPMyAdmin 中筛选时,如果没留意这个字段,容易误判客户端归属。
- 执行查询前先确认你的主用户表名:
SELECT DISTINCT providers FROM oauth_clients;
- 如果结果包含非
"users"值,后续所有关联查询(比如查 token 所属用户)都得带上provider条件 - 该字段不影响客户端能否被调用,但影响 Passport 内部的用户查找逻辑
修改或删除客户端后,记得清空 oauth_access_tokens 中残留 token
在 PHPMyAdmin 里手动删掉某个 oauth_clients 记录,不会自动级联删除它生成过的 token。这些孤立 token 仍可被用于 API 请求,直到过期。
如果你是为安全审计或清理测试数据而操作,务必同步清理依赖记录:
- 删客户端前,先删它的所有 access token:
DELETE FROM oauth_access_tokens WHERE client_id = 123;
- 如果用到刷新令牌(refresh tokens),还要删
oauth_refresh_tokens表中对应access_token_id的记录(需先 JOIN 查出) - Passport 5.x+ 默认不存 refresh token 到 DB(改用 JWT),但老版本或自定义配置下仍可能存在
字段命名和外键约束在不同 Passport 版本间有差异,比如 oauth_clients.id 在较新版本中是 UUID 字符串,不是自增整数——直接写 WHERE id = 123 会查不到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











