Laravel配置DingoAPI和JWT
引入Dingo API和JWT
1、在composer.json的require中添加
"require": { "dingo/api": "1.0.*@dev",
"tymon/jwt-auth": "0.5.*"
}
2、执行composer update 引入新添加的包
配置Dingo API
1、配置provider
Dingo\Api\Provider\LaravelServiceProvider::class,
2、生成配置文件方便配置:
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
执行之后会在config文件夹中生成api.php配置文件,Dingo API 配置完成。
配置JWT
1、配置provider
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class
2、配置aliases
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class, 'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class
3、生成配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
执行之后会在config文件夹中生成jwt.php配置文件
4、生成秘钥
php artisan jwt:generate
至此Dingo API 和 JWT引入完成。
配置Dingo API
在.env中添加一下配置:
API_STANDARDS_TREE=vnd API_PREFIX=api API_VERSION=v1 API_DEBUG=true
Dingo API的配置文件api.php中添加以下配置:
'auth' => [ // 配置Dingo API JWT basic' => function($app){ return new Dingo\Api\Auth\Provider\Basic($app['auth']); }, 'jwt' => function($app){ return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']); } ],
在Kernel中的routeMiddleware中添加以下配置:
'jwt.auth' => Tymon\JWTAuth\Middleware\GetUserFromToken::class, 'jwt.refresh' => Tymon\JWTAuth\Middleware\RefreshToken::class,
Dingo API和JWT引入和配置都完成了。
配置Dingo API路由
//接管路由 $api = app('Dingo\Api\Routing\Router'); // 配置api版本和路由 $api->version('v1', ['namespace' => 'App\Api\Controllers\V1'], function ($api) {
$api->get('lesson', 'LessonController@index')->name('auth.register');
);
此时可以使用 php aritsan api:route 查看api路由
创建BaseController use Dingo API的trait
namespace App\Api\Controllers\V1; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Dingo\Api\Routing\Helpers; class BaseController extends Controller { use Helpers; }
其他的控制器继承了BaseController就可以使用Dingo APIq强大的功能了
使用Transformer
在实际开发中,可能你想要返回的json尽可能的和数据库的不一致,这时可以使用Dingo API的transformer
定义每个模型对应的Transformer,每个transformer继承自TransformerAbstract (use League\Fractal\TransformerAbstract;);
<?php namespace App\Api\Transformers; use App\Lesson; use League\Fractal\TransformerAbstract; class LessonTransformer extends TransformerAbstract{ public function transform(Lesson $lesson) { return [ 'title' => $lesson['title'], 'content' => $lesson['body'], 'is_free' => $lesson['free'], ]; } }
对应的控制器的写法
<?php namespace App\Api\Controllers\V1; use Illuminate\Http\Request; use App\Lesson; use App\Api\Transformers\LessonTransformer; class LessonController extends BaseController { public function index() { $lessons = Lesson::all(); return $this->collection($lessons,new LessonTransformer()); //Dingo API的collection方法 } }
使用JWT
新建AuthController继承BaseController
public function authenticate(Request $request) { // grab credentials from the request $credentials = $request->only('email', 'password'); try { // attempt to verify the credentials and create a token for the user if (! $token = JWTAuth::attempt($credentials)) { return response()->json(['error' => 'invalid_credentials'], 401); } } catch (JWTException $e) { // something went wrong whilst attempting to encode the token return response()->json(['error' => 'could_not_create_token'], 500); } // all good so return the token return response()->json(compact('token')); }
路由:
$api->post('user/login','AuthController@authenticate')->name('auth.login');
用户成功登陆之后会返回一个token,如果我们把其他的路由放在jwt.auth的middleware的时候,此时的所有访问都要带着正确的token才可以访问。