例如:
提示:现在基本都是前后端分离了,所以前端要调用后台的接口,就有个验证的过程,一般情况都是用户登录后,后台返回一个token,然后前端在每次请求后台接口的时候都通过请求头将该token传给后台,后台进行验证。这种情况不一定要用passport,用jwt或者直接在数据库中加一个字段也行。
步骤:
composer create-project --prefer-dist laravel/laravel blog "8.5.*"
composer require laravel/passport
App\Providers\AppServiceProvider
use Illuminate\Support\Facades\Schema;
public function boot()
{
//
Schema::defaultStringLength(191);
}
php artisan migrate
use Laravel\Passport\HasApiTokens;
use HasApiTokens,HasFactory, Notifiable;
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],
],
php artisan passport:install
###命令执行完,oauth_clients表中的两条数据,一条name=Laravel Personal Access Client的数据是"个人访问"客户端需要用到的,也就是我们现在的API这种模式,还要一条是name=Laravel Password Grant Client的数据是“密码授权” 客户端用到。这个“密码授权”简单的就是说,需要用户的账户密码,还有该条数据的id,secret等参数去请求passport自带的路由(http://passport-server/oauth/token),认证成功就会返回token
//api.php路由文件,一个是有中间件,一个没有,中间件就是验证token的
Route::post('login',[\App\Http\Controllers\LoginController::class,'login']);
Route::get('user',[\App\Http\Controllers\UserController::class,'index'])->middleware('auth:api');
//
function login(Request $request){
//验证合法性等等。。。。
//登录成功,生成token
$user = User::where("name",'yang')->first();
$token = $user->createToken('personal token');
return $token;
}
//LoginController中的index方法,user方法中的api参数就是在config/auth.php中的guards中的值,
//因为api guard不是默认的,所以需要显式的指定要用guard
function index(Request $request){
return $request->user('api');
}
提示:大致流程是,
客户端==我自己某个网站
认证服务器==微信服务器
我的网站想接入微信的第三方登录,这样用户就不用在重新注册一个账号了,可以直接用微信用户的信息,但是微信不能平白无故给我们网站这些信息呀,所以就有了这种模式
具体实现(上面的配置依然有效,也就是上面API模式的步骤,下面也要配置):
composer require laravel/ui --dev
php artisan ui vue --auth
npm install
npm run dev
php artisan passport:client
use Laravel\Passport\Passport;
Passport::routes();
//注册有哪些scope,相当于设置权限,不设置就表示全部,这些scope需要在定义路由的时候指定好
/*Passport::tokensCan([
'view-posts' => 'Views',
'view-user' => 'View user',
]);*/
Passport::tokensExpireIn(now()->addHour(2)); // access_token 过期时间
Passport::refreshTokensExpireIn(now()->addDays(3)); // refresh_token 过期时间
Passport::personalAccessTokensExpireIn(now()->addSeconds(20));//个人访问令牌过期时间
http://www.passportapi.com/oauth/authorize?client_id=3&redirect_uri=http://localhost/callback&response_type=code&scope=*
//如果客户端没有请求任何特定的范围,你可以在 App\Providers\AuthServiceProvider 类的 boot 方法中使用 Passport::setDefaultScope 方法来定义默认的作用域。
use Laravel\Passport\Passport;
//这里相当于指定所有的范围,place-order是scope的名,接口中scope参数需要的就是这个,Place orders只是描述,方便看而已
Passport::tokensCan([
'place-orders' => 'Place orders',
'check-status' => 'Check order status',
]);
//这里是如果客户端没有指定范围,那我们可以给个默认的范围,*代表全部
Passport::setDefaultScope([
'check-status',
'place-orders',
]);
http://www.passportapi.com/oauth/authorize?client_id=3&redirect_uri=http://localhost/callback&response_type=code&scope=place-orders
个人访问令牌也可以指定作用域
//LoginController
$token = $user->createToken('My Token', ['place-orders'])->accessToken;
//Passport 包含两个中间件,可用于验证传入的请求是否包含访问指定作用域的令牌。 使用之前,需要将下面的中间件添加到 app/Http/Kernel.php 文件的 $routeMiddleware 属性中:
//scopes 中间件的可以简单理解成and,意思就是说在定义的路由的时候,要同时拥有指定的作用域才有权限
//scope 中间件可以简单理解成or, 意思就是说在定义的路由的时候,只要拥有一个指定的作用域就有权限
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
scopes
中间件来检查当前请求是否拥有指定的 所有 作用域:Route::get('/orders', function () {
// 访问令牌具有 "check-status" 和 "place-orders" 作用域...
//scopes 中间件的可以简单理解成and,scopes:check-status,place-orders意思就是说在定义的路由的时候,要同时拥有check-status和place-orders作用域才有权限
//scope 中间件可以简单理解成or, scope:check-status,place-orders意思就是说在定义的路由的时候,只要拥有check-status或者place-orders作用域就有权限
})->middleware(['auth:api', 'scopes:check-status,place-orders']);
提示:补充点
想起哪条再补充: