创立一个挪动端测试利用
composer create-project --prefer-dist laravel/laravel testapp
要让挪动端利用和后端利用之间进行受权认证,须要在后端利用 blog
中注册对应的挪动端利用 testapp
,在 blog
我的项目根目录下运行以下命令来注册 testapp
:
php artisan passport:client --password
testapp
# 显示后果
CLIENT_ID=7
CLIENT_SECRET=2JPrCvRyoJ14f0OqCe6nnQZNDfPLNNPY7TcfDnco
在 testapp
利用中,将借助 Laravel 自带的认证脚手架疾速实现认证路由和视图,以实现登录表单和申请提交:
php artisan make:auth
在 Auth/LoginController
控制器中重写 login
办法,将默认到数据库查问用户登录凭证的逻辑改为将申请发送到后端利用获取受权令牌:
// 在控制器顶部引入如下命名空间
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 字段中,发动申请就能够获取到认证接口返回数据了。
后端利用设置令牌的有效期
能够在 AuthServiceProvider
的 boot
办法中通过 Passport 门面上的 tokensExpireIn
或 refreshTokensExpireIn
办法来设置令牌有效期:
Passport::tokensExpireIn(now()->addDays(7));
# 或
Passport::refreshTokensExpireIn(now()->addDays(7));
前端利用刷新令牌
当受权拜访令牌过期后,能够申请 oauth/token
路由并指定操作类型为 refresh_token
来刷新令牌:
$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());
刷新令牌后,会生成新的令牌并返回,同时将老的令牌撤销。