composer create-project --prefer-dist laravel/laravel testapp
要让移动端应用和后端应用之间进行受权认证,须要在后端应用 blog
中注册对应的移动端应用 testapp
,在 blog
项目根目录下运行如下命令来注册 testapp
:php
php artisan passport:client --password testapp # 显示结果 CLIENT_ID=7 CLIENT_SECRET=2JPrCvRyoJ14f0OqCe6nnQZNDfPLNNPY7TcfDnco
在 testapp
应用中,将借助 Laravel 自带的认证脚手架快速实现认证路由和视图,以完成登陆表单和请求提交:前端
php artisan make:auth
在 Auth/LoginController
控制器中重写 login
方法,将默认到数据库查询用户登陆凭证的逻辑改成将请求发送到后端应用获取受权令牌:laravel
// 在控制器顶部引入以下命名空间 use GuzzleHttp\Client; use Illuminate\Http\Request; // 重写 AuthenticatesUsers 中的 login 方法 public function login(Request $request) { $request->validate([ 'email' => 'required|string', 'password' => 'required|string', ]); $http = new Client(); // 发送相关字段到后端应用获取受权令牌 $response = $http->post('http://blog.test/oauth/token', [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => 7, 'client_secret' => "2JPrCvRyoJ14f0OqCe6nnQZNDfPLNNPY7TcfDnco", 'username' => $request->input('email'), 'password' => $request->input('password'), 'scope' => '*' ], ]); return response($response->getBody()); }
访问移动端应用登陆页面 http://app.test/login
,输入在后端应用 blog
中注册过的用户信息,点击登陆,会将用户登陆凭证和应用配置传递到后端应用的 oauth/token
路由,经过后端应用中 Passport 底层的密码受权类进行校验,校验成功后就会返回令牌信息给移动端应用。数据库
返回结果中包含四个字段:后端
access_token
是受权令牌,能够将这个值设置到 Bearer Authentication
请求头去请求须要认证的后端 API 接口token_type
表示认证类型是 Bearer
refresh_token
用于在令牌过时后刷新令牌expires_in
表示令牌的有效期(单位是秒,即有效期一年)在 Postman 中请求后端 API 接口 http://blog.test/api/user
,选择请求 Authorization 的类型为 Bearer Token,而后将 access_token
值拷贝到 Token 字段中,发起请求就能够获取到认证接口返回数据了。api
能够在 AuthServiceProvider
的 boot
方法中经过 Passport 门面上的 tokensExpireIn
或 refreshTokensExpireIn
方法来设置令牌有效期:app
Passport::tokensExpireIn(now()->addDays(7)); # 或 Passport::refreshTokensExpireIn(now()->addDays(7));
当受权访问令牌过时后,能够请求 oauth/token
路由并指定操做类型为 refresh_token
来刷新令牌:composer
$http = new GuzzleHttp\Client; $response = $http->post('http://blog.test/oauth/token', [ 'form_params' => [ 'grant_type' => 'refresh_token', 'refresh_token' => 'your-refresh-token', 'client_id' => 'your-client-id', 'client_secret' => 'your-client-secret', 'scope' => '*', ], ]); return response($response->getBody());
刷新令牌后,会生成新的令牌并返回,同时将老的令牌撤销。ide