欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Laravel 整合 JWT 的方法 有大用

一.安装

我们使用Composer安装jwt扩展包:

 

[html] view plain copy
 
 print?
  1. composer require tymon/jwt-auth 0.5.*  

 

二.配置

 

安装完成后,需要在 config/app.php 中注册相应的服务提供者:

 

[html] view plain copy
 
 print?
  1. Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class  

然后注册需要用到的对应门面:

 

 

[html] view plain copy
 
 print?
  1. 'aliases' => [  
  2.        'JWTAuth'=> Tymon\JWTAuth\Facades\JWTAuth::class,  
  3.        'JWTFactory'=> Tymon\JWTAuth\Facades\JWTFactory::class,  
  4.    ],  

然后发布相应配置文件:

 

 

[html] view plain copy
 
 print?
  1. php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"  

最后生成密钥:

 

 

[html] view plain copy
 
 print?
  1. php artisan jwt:generate  

在 /app/Http/Kernel.php 中 $routeMiddleware 添加

 

 

[html] view plain copy
 
 print?
  1. 'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,  
  2. 'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,  

 

需要在路由组添加 :

 

[html] view plain copy
 
 print?
  1. ['middleware' => ['jwt.auth','jwt.refresh']  

其实,这是Jwt-auth 的默认中间件(Middleware)在处理身份认证。按其文档说明:我们可以在 /app/Exceptions/Handler.php 中可以进行异常判断。但有可能并没有效果。这种情况下,我们可以自己去添加一个中间件处理身份认证。

 

1、添加一个 Middleware
可以使用命令行添加:php artisan make:middleware GetUserFromToken 此命令将会 在 app/Http/Middleware 目录内置立一个名称GetUserFromToken 的类。

 

2、在 GetUserFromToken 中编辑代码

 

[html] view plain copy
 
 print?
  1. <?php  
  2.   
  3. namespace App\Http\Middleware;  
  4.   
  5. use Closure;  
  6. use JWTAuth;  
  7. use Tymon\JWTAuth\Exceptions\JWTException;  
  8. use Tymon\JWTAuth\Exceptions\TokenExpiredException;  
  9. use Tymon\JWTAuth\Exceptions\TokenInvalidException;  
  10.   
  11. class GetUserFromToken  
  12. {  
  13.     /**  
  14.      * @param  \Illuminate\Http\Request  $request  
  15.      * @param  \Closure  $next  
  16.      * @return mixed  
  17.      */  
  18. public function handle($request, Closure $next)  
  19. {  
  20.     try {  
  21.   
  22.         if (! $user = JWTAuth::parseToken()->authenticate()) {  
  23.             return response()->json([  
  24.                 'errcode' => 400004,  
  25.                 'errmsg' => 'user not found'  
  26.             ], 404);  
  27.         }  
  28.   
  29.     } catch (TokenExpiredException $e) {  
  30.   
  31.         return response()->json([  
  32.             'errcode' => 400001,  
  33.             'errmsg' => 'token expired'  
  34.         ], $e->getStatusCode());  
  35.   
  36.     } catch (TokenInvalidException $e) {  
  37.   
  38.         return response()->json([  
  39.             'errcode' => 400003,  
  40.             'errmsg' => 'token invalid'  
  41.         ], $e->getStatusCode());  
  42.   
  43.     } catch (JWTException $e) {  
  44.   
  45.         return response()->json([  
  46.             'errcode' => 400002,  
  47.             'errmsg' => 'token absent'  
  48.         ], $e->getStatusCode());  
  49.   
  50.     }  
  51.     return $next($request);  
  52. }  
  53. }  

3、在 /app/Http/Kernel.php 中 $routeMiddleware 新增 内容

 

 

[html] view plain copy
 
 print?
  1. protected $routeMiddleware = [  
  2.     'auth' => \App\Http\Middleware\Authenticate::class,  
  3.     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,  
  4.     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,  
  5.     'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,  
  6.     'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,  
  7.     'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,  
  8.     'jwt.api.auth' => \App\Http\Middleware\GetUserFromToken::class, //新增注册的中间件  
  9. ];  

4、在路由中指定使用 jwt.api.auth

 

 

[html] view plain copy
 
 print?
  1. ['middleware' => 'jwt.api.auth']  
  2.  
来自  http://blog.csdn.net/rorntuck7/article/details/52330119
普通分类: