1.安装
composer require dingo/api
2.发布配置:
php artisan vendor:publish
选择DingoApi发布.
3.向.env文件添加配置
(1)项目环境
API_STANDARDS_TREE = prs
x:本地开发私有环境
prs:未对外公布,单页应用
vnd:开放所有用户
(2)项目简称
API_SUBTYPE=test
(3)前缀
API_PREFIX=api
(4)api版本
API_VERSION=v1
(5)测试环境,显示错误信息
API_DEBUG=true
3.接管路由
$api = app('Dingo\Api\Routing\Router');
/* * 1.确定namespace. * 2.启动数组序列化器 * 3.开启模型绑定 */ $api->version('v1',[ 'namespace' => 'App\Http\Controllers\Api', 'middleware' => ['serializer:array','bindings'] ],function ($api){ /* * 游客可以访问的接口 * 1.限制接口访问次数 * */ $api->group([ 'middleware' => 'api.throttle', 'limit' => config('api.rate_limits.access.limit'), 'expires' => config('api.rate_limits.access.expires'), ],function($api){ //这里写不需要验证的接口 $api->(……)->name(……); 。 。 。 /* * 需要验证的接口 * 1.授权才能访问 */ $api->group([ 'middleware' => 'api.auth', ],function ($api){ //这里写需要验证的接口 $api->(……)->name(……); 。 。 。 }); }); });
4.安装序列化器选择器
composer require liyu/dingo-serializer-switch
5.创建数据转换器
php namespace App\Transformers; use App\Models\Model; use League\Fractal\TransformerAbstract; class ModelTransformer extends TransformerAbstract { public function transform(Model $model) { return [ 'id' => $model->id, 。 。 。 。 ]; } }
6.api鉴权
composer require tymon/jwt-auth:^1.0.0
生成jwt密匙:
php artisan jwt:secret
将config/auth.php的api guard的driver换成jwt:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ],
修改dingoapi的设置配合jwt实现api鉴权:
config/api。php
'auth' => [ 'jwt' => 'Dingo\Api\Auth\Provider\JWT', ],
在app/Models/User。php中添加:
php namespace App\Models; use Auth; use Spatie\Permission\Traits\HasRoles; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait; use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract; class User extends Authenticatable implements MustVerifyEmailContract, JWTSubject . . . public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; } }
7.授权,获取token:
1.Auth::guard('api')->attempt($credentials)) Auth::guard('api')->factory()->getTTL() * 60 2.Auth::guard('api')->fromUser($user); Auth::guard('api')->factory()->getTTL() * 60
8.刷新删除token
1.$token = Auth::guard('api')->refresh(); 2.Auth::guard('api')->logout();
9.访问需要授权的接口
在请求的header中添加:
Authorization: Bearer {token}
10.开发时用arisan 获取token
1.创建command
2.
public function handle() { $userId = $this->ask('输入用户 id'); $user = User::find($userId); if (!$user) { return $this->error('用户不存在'); } // 过期时间 $ttl = 365*24*60; $this->info(\Auth::guard('api')->setTTL($ttl)->fromUser($user)); } }