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才可以访问。

  

posted @ 2017-08-17 08:41  林豆包的长颈鹿  阅读(761)  评论(0编辑  收藏  举报