Laravel Passport 的三种客户端模式需按业务场景严格区分:密码模式用于可控前后端登录,授权码模式用于第三方网站接入,个人访问令牌用于开发调试;各自配置、路由和调用方式均不同,混用将导致认证失败。

Laravel Passport 的客户端模式不是“选一种用”,而是按业务场景明确区分、各自独立配置和调用的。核心就三种:密码模式(password_client)、授权码模式(authorization_code)、个人访问令牌(personal_access_client)。它们用途不同、创建方式不同、调用接口也不同,混用或错配是拿不到 token 的最常见原因。
密码模式(移动端/后台登录)
适用于你完全掌控前后端的场景,比如 App 登录、管理后台调用 API。用户凭账号密码直接换 token,不跳转、无授权页。
- 必须用
passport:install生成的第二组 client(password_client = 1),不是第一组 -
username字段值必须是邮箱(Passport 内置逻辑固定按 email 查询,哪怕你改了 User 模型的 $username 属性) - POST
/oauth/token时,请求体必须是表单格式(application/x-www-form-urlencoded),含以下字段:grant_type=password、client_id、client_secret、username、password -
client_secret是服务端密钥,绝不能暴露在前端;应由后端登录接口代为请求/oauth/token并返回 token 给前端
授权码模式(第三方网站接入)
适用于你作为资源服务器,允许其他网站(如博客系统、SaaS 工具)用你的用户身份调用 API。流程包含重定向、用户授权、换 token 三步。
- 需在
AuthServiceProvider@boot()中启用:$router->forAuthorizationCodes() - 先用
php artisan passport:client创建一个新客户端(带 redirect URI),它会存入oauth_clients表 - 第三方跳转到你的
/oauth/authorize地址,用户确认后重定向回其指定地址并带上code - 第三方再用该
code向/oauth/token换取 access_token,此时grant_type=authorization_code - 此模式下,
client_secret可公开(因为 code 有有效期且绑定 redirect_uri),但依然建议后端保管
个人访问令牌(开发测试/CLI 工具)
适用于你自己的应用内快速调试、脚本调用或内部工具,不走 OAuth 流程,直接由用户对象生成长期有效的 token。
- 需在
AuthServiceProvider@boot()中启用:$router->forPersonalAccessTokens()(Laravel 10+ 默认禁用) - 运行
php artisan passport:client --personal创建专用客户端(或passport:install已自动生成第一组) - 代码中调用:
$user->createToken('name', ['scope1', 'scope2'])->accessToken - 生成的 token 本质是 JWT,可直接用于
Authorization: Bearer xxx请求受保护接口 - 注意:它不经过
/oauth/token,也不需要 client_id/client_secret,仅限可信上下文使用
三种模式底层共用同一套密钥和数据库表,但路由、校验逻辑、token 类型和生命周期完全不同。用错客户端、漏启路由、传错 grant_type 或 content-type,都会导致 401 或 404。关键不在“怎么装”,而在“用哪条路”。


















