安装
composer require laravel/passport
运行迁移
php artisan migrate
创建访问令牌
- [个人访问] 客户端和 [密码授权] 客户端
php artisan passport:install
- 单独创建 密码授权 客户端
php artisan passport:client --password
- 单独创建 个人访问 客户端
php artisan passport:client --client
模型中使用
在模型中加入 HasApiTokens Trait
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
生成 Passport 生成访问令牌所需的秘钥(大白话:每生成一个令牌都要使用到它)
生成的秘钥一般情况不应放在版本控制中,默认生成的文件存放在 storage 目录下
php artisan passport:keys
令牌的有限期配置
在 AuthServiceProvider 中配置
public function boot()
{
$this->registerPolicies();
Passport::routes();
// 配置 令牌 失效时间
Passport::tokensExpireIn(now()->addDays(15));
// 配置 刷新令牌 失效时间
Passport::refreshTokensExpireIn(now()->addDays(30));
// 配置 个人访问令牌 失效时间
Passport::personalAccessTokensExpireIn(now()->addMonths(6));
}
密码授权方式获取访问令牌
http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
],
]);
return json_decode((string) $response->getBody(), true);
自定义登录用户名
在对应的 用户(如 User、Admin) 模型中进行设置
<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
/**
* 通过给定的username获取用户实例。
*
* @param string $username
* @return \App\User
*/
public function findForPassport($username)
{
return $this->where('username', $username)->first();
}
}
demo:https://github.com/ruitaoZhang/laravel-api-demo
多表认证相关及注意要点
1、passport中有 客户端密码授权、个人授权。
如果是要用到第三方授权登录,可以使用 个人授权 Personal Token
- 密码授权通过请求 /oauth/token 来获取 access_token
- 个人授权可通过
$user->createToken ('name_string')->token
来获取
2、attempt 方法
Passport 的 guard 并未实现 attempt 方法,所有当使用 Auth::attempt($credentials)
会报错
3、多表用户认证,得到的 access_token 可以通过其他表认证?
解决
首先在 app/Kernel
中的 $routeMiddleware
加入
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
在 AuthServiceProvider
中的 boot()
方法定义授权作用域(Scope)
public function boot()
{
$this->registerPolicies();
Passport::routes();
// 定义作用域
Passport::tokensCan([
'admin-api' => 'admin api',
'user-api' => 'user api',
]);
}
在获取 token 时,指定对应的 作用域(Scope)
$user->createToken('Personal Access Token', ['user-api'])->token;
在认证路由中添加中间件
Route::group([
'middleware' => ['auth:api', 'scope:user-api']
], function () {
Route::post('userInfo', 'Api\AuthController@userInfo');
});
相应文档地址:查看