Laravel Passport 基于
thephpleague/oauth2-server
包实现了完整的OAuth2
服务php
composer require laravel/passport
Laravel\Passport\PassportServiceProvider::class
passport
的表php artisan vendor:publish --tag=passport-migrations php artisan migrate
Token
秘钥php artisan passport:keys
User
模型增长use Laravel\Passport\HasApiTokens
api guard
的driver
切换为passport
OAuth2
路由# AuthServiceProvider::boot中注册令牌签发撤销相关的路由 - /oauth/authorize - /oauth/token Passport::routes()
Token
过时时间(默认不过时)# AuthServiceProvider::boot中设置过时时间 Passport::tokensExpireIn(Carbon::now()->addDays(15)) Passport::refreshTokensExpireIn(Carbon::now()->addDays(30))
Passport
提供了一套方便的JsonAPI
式的Vue
组件用于OAuth2
相关服务前端
# 发布vue组件至resources/assets/js/components php artisan vendor:publish --tag=passport-components # resources/assets/js/app.js中注册组件 - passport-clients -> Clients.vue - passport-authorized-clients -> AuthorizedClients.vue - passport-personal-access-tokens -> PersonalAccessTokens.vue # 编译asset前端程序 npm run dev # 使用组件服务 <passport-clients></passport-clients> <passport-authorized-clients></passport-authorized-clients> <passport-personal-access-tokens></passport-personal-access-tokens>
1. Artisan方式管理vue
# 受权服务器上注册客户端应用 php artisan passport:client - 提供:应用名、受权后回调地址等 - 响应:client ID、secret
2. JsonAPI方式管理laravel
# 认证用户名下的客户端列表 GET /oauth/clients # 为认证用户新建客户端 POST /oauth/clients - 数据:{name:'', redirect:''} - 响应:client ID、client secret # 为认证用户更新客户端 PUT /oauth/clients/{client-id} - 请求:{name:'', redirect:''} - 响应:client ID、client secret # 删除认证用户名下的客户端 DELETE /oauth/clients/{client-id}
OAuth2 设计了四种受权模式用于不一样的应用场景
web
Token
# 客户端应用引导用户至受权服务器 客户端:Get /redirect 受权服务器:Get /oauth/authorize?client_id=&redirect_uri=http://example.com/callback&response_type=code&scope= # 用户赞成受权后回跳至redirect_uri - redirect_uri必须和client注册时的redirect一致 - 定制受权页面 - php artisan vendor:publish --tag=passport-views - 视图路径 resources/views/vendor/passport # 受权码交换token - 客户端:Get /callback(即redirect_uri) - 受权服务器:Post /oauth/token - 数据:{grant_type:'authorization_code', client_id:'', client_secret:'', redirect_uri:'http://example.com/callback', code:''} - 响应:access_token、refresh_token、expires_in # 刷新Token 受权服务器: Post /oauth/token - 数据:{grant_type:'refresh_token', refresh_token:'', client_id:'', client_secret:'', scope:''} - 响应:access_token、refresh_token、expires_in
Token
建立密码受权客户端npm
php artisan passport:client --password
请求Tokenjson
受权服务器:Post /oauth/token - 数据:{grant_type:'password', client_id:'', client_secret:'', username:'', password: '', scope: ''} #密码受权模式能够指定scope为*所有权限域 - 响应:access_token、refresh_token、expires_in
# AuthServiceProvider::boot中启用简化受权 Passport::enableImplicitGrant() 客户端:Get /redirect 受权服务器:/oauth/authorize?client_id=&redirect_uri=http://example.com/callback&response_type=token&scope=
受权服务器:Post /oauth/token - 数据:{grant_type:'client_credentials', client_id:'', client_secret:'', scope: ''} #密码受权模式能够指定scope为*所有权限域 - 响应:access_token、refresh_token、expires_in
OAuth2
受权模式Token
便于API
测试Token
老是有效的, 不随过时配置而变化# 建立私人访问客户端 php artisan passport:client --personal # 管理私人访问Token $scopes = [] $token = $user->createToken('token_name' [, $scopes])->accessToken ## JsonAPI管理 ## GET /oauth/scopes #全部权限域列表 GET /oauth/personal-access-tokens #用户建立的全部私人访问Token POST /oauth/personal-access-tokens {name:'token_name', scopes:[]} #新建私人访问令牌 DELETE /oauth/personal-access-tokens/{token-id} #删除私人访问令牌
# 主要用于测试,当前用户模拟为指定用户 Passport::actingAs($user, array scopes)
# 快捷生成三个组件: - token秘钥 - 密码受权客户端 - personal access client php artisan passport:install
->middleware('auth:api')
(配置api guard
使用passport driver
)Accept: application/json
Authorization: Bearer Token
定义Scope
- 表明了一个权限组api
# AuthServiceProvider::boot中定义 Passport::tokensCan([ '权限名' => '权限描述', ... ]);
Token设定Scope安全
- 受权码模式 客户端:Get /redirect 受权服务器:Get /oauth/authorize?client_id=&redirect_uri=http://example.com/callback&response_type=code&scope=权限列表(空格隔开) - 私人令牌模式 $scopes = [] $token = $user->createToken('token_name' [, $scopes])->accessToken
检查Scope服务器
# `\App\Http\Kernel::$routeMiddleware`注册如下路由中间件 - 'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class * 检查知足全部权限域 * `->middleware('scopes:权限域1,...')` - 'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class * 检查知足任一权限域 * `->middleware('scope:权限域1,...')` # 直接检查用户Token是否拥有指定权限域 $user->tokenCan('权限域')
web
中间件增长\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class
laravel_token cookie
(内含一个加密的JWT
)HTPP
头部的Token
JS框架
实际状况配置请求自动带上头部
X-CSRF-TOKEN
:CSRF Token
X-Requested-With
:XMLHttpRequest
Laravel\Passport\Events\AccessTokenCreated
Laravel\Passport\Events\RefreshTokenCreated