您现在的位置: 首页 > 开发编程 > Laravel教程 > 正文

laravel5.4 + dingo api + jwt接口token实战配置讲解

作者:admin来源:网络浏览:时间:2017-08-03 20:47:47我要评论
分享到
项目中使用dingo + jwt来写接口以及安全验证,下面讲解一下配置过程。

新装一个Laravel

  1. composer create-project --prefer-dist laravel/laravel myApiProject 
安装dingo api

在composer.json中添加

  1. composer require dingo/api:1.0.x@dev 
在config/app.php

  1. 'providers' => [ 
  2.      //前面很多 
  3.     Dingo\Api\Provider\LaravelServiceProvider::class

发布配置文件

终端运行

  1. php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider" 
打开.env文件,把dingo的配置放到最后面

  1. API_STANDARDS_TREE=vnd // 环境 
  2. API_SUBTYPE=myapp // 子类型 
  3. API_PREFIX=api // 前缀 
  4. API_DOMAIN=api.myapp.com //子域名  (前缀和子域名只能存在一个)可选 
  5. API_VERSION=v1 // 版本 
  6. API_NAME=My API // 名字(使用API Blueprint命令才会用到) 
  7. API_CONDITIONAL_REQUEST=false // 带条件的请求 
  8. API_STRICT=false // Strict模式 
  9. API_DEFAULT_FORMAT=json // 响应格式 
  10. API_DEBUG=true // 调试模式 
下面是我的配置:

  1. API_STANDARDS_TREE=vnd 
  2. API_SUBTYPE=emall 
  3. API_PREFIX=api 
  4. API_VERSION=v1 
没必要每个都配上去,主要的配一下就可以了

安装jwt

还是composer.json

  1. "require-dev": { 
  2.     "tymon/jwt-auth""1.0.*" 
  3. }, 
  4. "minimum-stability""dev"
  5. "prefer-stable"true  

其实只需要加上,下面是我的写法,上面是国外的写法
 
  1. "tymon/jwt-auth""1.0.*@dev" 
运行composer update将dingo和jwt装上去

添加jwt的认证

在config/api.php添加内容

  1. 'auth' => [ 
  2.     'jwt' => Dingo\Api\Auth\Provider\JWT::class 
在config/app.php

  1. 'providers' => [ 
  2.     // 前面很多 
  3.     Tymon\JWTAuth\Providers\LaravelServiceProvider::class 
  4. ], 

  1. 'aliases' => [ 
  2.     // 前面很多 
  3.     'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class 

在终端运行:

  1. php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider" 
会生成config/jwt.php 这是jwt的配置文件

生成jwt的key到.env文件运行:

  1. php artisan jwt:secret 

路由

在routers/api.php

中新建内容,两个路径分别是注册和登录:

//这句接管路由
 

  1. $api = app('Dingo\Api\Routing\Router'); 
  2.  
  3. $api->version('v1'function ($api) { 
  4.  
  5. $api->post('login''App\Http\Controllers\Api\Auth\LoginController@login'); 
  6. $api->post('register''App\Http\Controllers\Api\Auth\RegisterController@register'); 
  7.  
  8. }); 


生成两个controller

终端输入:

  1. php artisan make:controller App\\Http\\Api\\Auth\\LoginController 
  2. php artisan make:controller App\\Http\\Api\\Auth\\RegisterController   

数据库

备置.env文件

  1. DB_CONNECTION=mysql 
  2. DB_HOST=127.0.0.1 
  3. DB_PORT=3306 
  4. DB_DATABASE=databasename 
  5. DB_USERNAME=root 
  6. DB_PASSWORD= 

添加迁移文件,当然你也可以使用php artisan make:auth 安装Laravel自带的用户

下面我们用新建的吧

终端运行:

  1. php artisan make:model User -m  

此命令可以添加迁移文件同时添加Model
迁移文件一般在database/migrations/时间格式_create_users_table.php
打开迁移文件修改以下内容:

  1. public function up() 
  2.     Schema::create('users'function (Blueprint $table) { 
  3.         $table->increments('id'); 
  4.         $table->string('name')->unique(); 
  5.         $table->string('email')->unique(); 
  6.         $table->string('password'); 
  7.         $table->rememberToken(); 
  8.         $table->timestamps(); 
  9.     }); 

终端运行:php artisan migrate创建users表

打开我们新建的Model在App/下User.php

添加如下内容:
 

  1. use Illuminate\Notifications\Notifiable; 
  2. use Illuminate\Foundation\Auth\User as Authenticatable; 
  3. use Tymon\JWTAuth\Contracts\JWTSubject; 
  4.  
  5. class User extends Authenticatable implements JWTSubject 
  6.     use Notifiable; 
  7.  
  8.     /** 
  9.      * The attributes that are mass assignable. 
  10.      * 
  11.      * @var array 
  12.      */ 
  13.     protected $fillable = [ 
  14.         'name''email''password'
  15.     ]; 
  16.  
  17.     /** 
  18.      * The attributes that should be hidden for arrays. 
  19.      * 
  20.      * @var array 
  21.      */ 
  22.     protected $hidden = [ 
  23.         'password''remember_token'
  24.     ]; 
  25.  
  26.     /** 
  27.      * Get the identifier that will be stored in the subject claim of the JWT. 
  28.      * 
  29.      * @return mixed 
  30.      */ 
  31.     public function getJWTIdentifier() 
  32.     { 
  33.         return $this->getKey(); 
  34.     } 
  35.  
  36.     /** 
  37.      * Return a key value array, containing any custom claims to be added to the JWT. 
  38.      * 
  39.      * @return array 
  40.      */ 
  41.     public function getJWTCustomClaims() 
  42.     { 
  43.         return []; 
  44.     } 


注册

在之前建的App/Http/Controller/Api/Auth/RegisterController.php
添加如下内容:
 

  1. use App\Http\Controllers\Controller; 
  2. use App\User; 
  3. use Dingo\Api\Exception\StoreResourceFailedException; 
  4. use Dingo\Api\Routing\Helpers; 
  5. use Illuminate\Foundation\Auth\RegistersUsers; 
  6. use Illuminate\Http\Request; 
  7. use Illuminate\Support\Facades\Validator; 
  8. use Tymon\JWTAuth\Facades\JWTAuth; 
  9.  
  10. class RegisterController extends Controller 
  11.     use RegistersUsers; 
  12.     use Helpers; 
  13.  
  14.     public function register(Request $request){ 
  15.  
  16.         $validator = $this->validator($request->all()); 
  17.         if($validator->fails()){ 
  18.             throw new StoreResourceFailedException("Validation Error"$validator->errors()); 
  19.         } 
  20.  
  21.         $user = $this->create($request->all()); 
  22.  
  23.         if($user){ 
  24.  
  25.             $token = JWTAuth::fromUser($user); 
  26.  
  27.             return $this->response->array([ 
  28.                 "token" => $token
  29.                 "message" => "User created"
  30.                 "status_code" => 201 
  31.             ]); 
  32.         }else
  33.             return $this->response->error("User Not Found...", 404); 
  34.         } 
  35.     } 
  36.  
  37.     protected function validator(array $data
  38.     { 
  39.         return Validator::make($data, [ 
  40.             'name' => 'required|unique:users'
  41.             'email' => 'required|email|max:255|unique:users'
  42.             'password' => 'required|min:6'
  43.         ]); 
  44.     } 
  45.  
  46.     protected function create(array $data
  47.     { 
  48.         return User::create([ 
  49.             'name' => $data['name'], 
  50.             'email' => $data['email'], 
  51.             'password' => bcrypt($data['password']), 
  52.         ]); 
  53.     } 
  54.  

打开Postman进行测试地址:http://127.0.0.1/myApiProject/public/api/register

laravel5.4 + dingo api + jwt接口token实战配置讲解

登录

在之前建的App/Http/Controller/Api/Auth/LoginController.php
 

  1. use App\User; 
  2. use Dingo\Api\Routing\Helpers; 
  3. use Illuminate\Foundation\Auth\AuthenticatesUsers; 
  4. use Illuminate\Http\Request; 
  5. use App\Http\Controllers\Controller; 
  6. use Illuminate\Support\Facades\Hash; 
  7. use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException; 
  8. use Tymon\JWTAuth\Facades\JWTAuth; 
  9.  
  10. class LoginController extends Controller 
  11.     use AuthenticatesUsers; 
  12.     use Helpers; 
  13.  
  14.     public function login(Request $request){ 
  15.  
  16.         $user = User::where('email'$request->email)->orWhere('name'$request->email)->first(); 
  17.  
  18.         if($user && Hash::check($request->get('password'), $user->password)){ 
  19.             $token = JWTAuth::fromUser($user); 
  20.             return $this->sendLoginResponse($request$token); 
  21.         } 
  22.  
  23.         return $this->sendFailedLoginResponse($request); 
  24.     } 
  25.  
  26.     public function sendLoginResponse(Request $request$token){ 
  27.         $this->clearLoginAttempts($request); 
  28.  
  29.         return $this->authenticated($token); 
  30.     } 
  31.  
  32.     public function authenticated($token){ 
  33.         return $this->response->array([ 
  34.             'token' => $token
  35.             'status_code' => 200, 
  36.             'message' => 'User Authenticated' 
  37.         ]); 
  38.     } 
  39.  
  40.     public function sendFailedLoginResponse(){ 
  41.         throw new UnauthorizedHttpException("Bad Credentials"); 
  42.     } 
  43.  
  44.     public function logout(){ 
  45.         $this->guard()->logout(); 
  46.     } 
  47.  } 

打开Postman进行测试地址:http://127.0.0.1/myApiProject/public/api/register

laravel5.4 + dingo api + jwt接口token实战配置讲解

可以看到我们得到了token

拉取用户信息
在routers/api.php添加

  1. $api->group(['middleware' => 'api.auth'], function ($api) { 
  2.     $api->get('user''App\Http\Controllers\Api\UsersController@index'); 
  3. }); 


终端运行:

  1. php artisan make:controller App\\Http\\Controllers\\Api\\UsersController 

在UsersController.php中添加

  1. namespace App\Http\Controllers\Api; 
  2.  
  3. use Dingo\Api\Routing\Helpers; 
  4. use Illuminate\Routing\Controller; 
  5.  
  6. class UsersController extends Controller 
  7.     use Helpers; 
  8.  
  9.     public function __construct() 
  10.     { 
  11.         $this->middleware('api.auth'); 
  12.     } 
  13.     public function index(){ 
  14. //        return User::all(); 
  15.         $user = $this->auth->user(); 
  16.  
  17.         return $user
  18.     } 

打开Postman进行测试地址:http://127.0.0.1/myApiProject/public/api/user
注意因为我们设定了需要token才能拉取数据,所以在请求头Header中
我们添加了:Authorization :Bearer + token
Bearer是一种token_type在源码中有提到,应该是一种标准 

laravel5.4 + dingo api + jwt接口token实战配置讲解
 

相关热词搜索: Laravel5 dingo接口