当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel配合jwt使用的方法实例

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-29 08:38:23 浏览: 评论:0 

这篇文章主要给大家介绍了关于Laravel配合jwt使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

测试使用的是Laravel5.5版本。

安装

composer require tymon/jwt-auth=1.0.0-rc.5

配置

生成配置

  1. php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider" 
  2.  
  3. php artisan jwt:secret 

auth配置

  1. <?php 
  2.  
  3. return [ 
  4.  ... 
  5.  
  6.  'defaults' => [ 
  7.   'guard' => 'web'
  8.   'passwords' => 'users'
  9.  ], 
  10.  
  11.  
  12.  'guards' => [ 
  13.   'web' => [ 
  14.    'driver' => 'session'
  15.    'provider' => 'users'
  16.   ], 
  17.   // 使用jwt 
  18.   'api' => [ 
  19.    'driver' => 'jwt'
  20.    'provider' => 'apiUser'
  21.   ], 
  22.  ], 
  23.  
  24.  
  25.  'providers' => [ 
  26.   ... 
  27.   // 指定model 
  28.   'apiUser' => [ 
  29.    'driver' => 'eloquent'
  30.    'model' => App\ApiUser::class
  31.   ],  
  32.  ], 
  33. ]; 

编码

控制器:

  1. <?php 
  2.  
  3. namespace App\Http\Controllers\Api; 
  4.  
  5. use App\ApiUser; 
  6. use App\Http\Controllers\Controller; 
  7. use Illuminate\Http\Request; 
  8. use Tymon\JWTAuth\Facades\JWTAuth; 
  9.  
  10. class AuthController extends Controller 
  11.  /** 
  12.   * 中间件去除login和refresh 
  13.   * 
  14.   * @return void 
  15.   */ 
  16.  public function __construct() 
  17.  { 
  18.   $this->middleware('auth:api', ['except' => ['login','refresh']]); 
  19.  } 
  20.  
  21.  /** 
  22.   * Get a JWT via given credentials. 
  23.   * 
  24.   * @return \Illuminate\Http\JsonResponse 
  25.   */ 
  26.  public function login(Request $request
  27.  { 
  28.   $credentials = $request->only('phone''password'); 
  29.  
  30.   if (count($credentials) < 2) { 
  31.    return response()->json(['error' => 'Unauthorized'], 401); 
  32.   }  
  33.  
  34.   $user = ApiUser::where('phone'$credentials['phone']) 
  35.    ->where('password', md5($credentials['password'])) 
  36.    ->first(); 
  37.   if (emptyempty($user) || !$token = JWTAuth::fromUser($user)) { 
  38.    return response()->json(['error' => 'Unauthorized'], 401); 
  39.   } 
  40.   // dd($token); 
  41.  
  42.   return $this->respondWithToken($token); 
  43.  } 
  44.  
  45.  /** 
  46.   * Get the authenticated User. 
  47.   * 
  48.   * @return \Illuminate\Http\JsonResponse 
  49.   */ 
  50.  public function me() 
  51.  { 
  52.   return response()->json(auth('api')->user()); 
  53.  } 
  54.  
  55.  /** 
  56.   * Log the user out (Invalidate the token). 
  57.   * 
  58.   * @return \Illuminate\Http\JsonResponse 
  59.   */ 
  60.  public function logout() 
  61.  { 
  62.   auth()->logout(); 
  63.  
  64.   return response()->json(['message' => 'Successfully logged out']); 
  65.  } 
  66.  
  67.  /** 
  68.   * Refresh a token. 
  69.   * 
  70.   * @return \Illuminate\Http\JsonResponse 
  71.   */ 
  72.  public function refresh() 
  73.  { 
  74.   return $this->respondWithToken(auth('api')->refresh()); 
  75.  } 
  76.  
  77.  /** 
  78.   * Get the token array structure. 
  79.   * 
  80.   * @param string $token 
  81.   * 
  82.   * @return \Illuminate\Http\JsonResponse 
  83.   */ 
  84.  protected function respondWithToken($token
  85.  { 
  86.   return response()->json([ 
  87.    'access_token' => $token
  88.    'token_type' => 'bearer'
  89.    'expires_in' => auth('api')->factory()->getTTL() * 60 
  90.   ]); 
  91.  } 

路由:

此处注意,我为了方便测试,使用了get方法,生产环境不建议使用get。

  1. // routes/api.php 
  2.  
  3. Route::middleware('api')->prefix('auth')->namespace('Api')->group(function () { 
  4.  Route::get('login''AuthController@login'); 
  5.  Route::post('logout''AuthController@logout'); 
  6.  Route::get('refresh''AuthController@refresh'); 
  7.  Route::get('me''AuthController@me'); 
  8. }); 

测试一下:

Laravel配合jwt使用的方法实例

Laravel配合jwt使用的方法实例

Laravel配合jwt使用的方法实例

unauthenticated处理

这里需要注意下,unauthenticated处理一下比较好,否则会默认跳转login登录页面。

  1. <?php 
  2.  
  3. namespace App\Exceptions; 
  4.  
  5. use Exception; 
  6. use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; 
  7. use Illuminate\Auth\AuthenticationException; 
  8.  
  9. class Handler extends ExceptionHandler 
  10.   ... 
  11.  
  12.   protected function unauthenticated($request, AuthenticationException $exception
  13.   { 
  14.     return response()->json(['message' => 'Unauthenticated.'], 401); 
  15.      /*非api可以这么处理 
  16.     return $request->expectsJson() 
  17.           ? response()->json(['message' => 'Unauthenticated.'], 401) 
  18.           : redirect()->guest(route('login')); 
  19.           */ 
  20.   } 

加入token refresh

加入中间件代码:

  1. <?php 
  2. namespace App\Http\Middleware; 
  3.    
  4. use Closure; 
  5. use Tymon\JWTAuth\Facades\JWTAuth; 
  6. use Tymon\JWTAuth\Exceptions\JWTException; 
  7. use Illuminate\Auth\AuthenticationException; 
  8. use Tymon\JWTAuth\Exceptions\TokenExpiredException; 
  9. use Illuminate\Http\Exceptions\HttpResponseException; 
  10. use Tymon\JWTAuth\Http\Middleware\BaseMiddleware; 
  11.  
  12. class RefreshToken extends BaseMiddleware 
  13.  
  14.   /** 
  15.    * Handle an incoming request. 
  16.    * 
  17.    * @param \Illuminate\Http\Request $request 
  18.    * @param \Closure $next 
  19.    * @return mixed 
  20.    */ 
  21.   public function handle($request, Closure $next
  22.   {  
  23.     try{ 
  24.       //检查请求中是否带有token 如果没有token值则抛出异常 
  25.       $this->checkForToken($request);  
  26.       if ($request->user = JWTAuth::parseToken()->authenticate()) {     
  27.         return $next($request); 
  28.       } 
  29.       throw new AuthenticationException('Unauthorized', []); 
  30.     }catch (TokenExpiredException $exception){ 
  31.       //返回特殊的code 
  32.       throw new HttpResponseException(response()->json([ 
  33.         'message' => 'token expired' 
  34.       ])); 
  35.     } catch (\Exception $exception) { 
  36.       throw new AuthenticationException('Unauthorized', []); 
  37.     } 
  38.   } 

注册:

  1. <?php 
  2.  
  3. namespace App\Http; 
  4.  
  5. use Illuminate\Foundation\Http\Kernel as HttpKernel; 
  6.  
  7. class Kernel extends HttpKernel 
  8.   ... 
  9.   protected $routeMiddleware = [ 
  10.     'token.refresh' => \App\Http\Middleware\RefreshToken::class
  11.     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class
  12.     'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class
  13.     'can' => \Illuminate\Auth\Middleware\Authorize::class
  14.     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class
  15.     'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class
  16.   ]; 

相应的控制器构造函数修改:

  1. public function __construct() 
  2.     $this->middleware('token.refresh', ['except' => ['login','refresh']]); 

把token时间设置成1分钟,测试一下。

Laravel配合jwt使用的方法实例

可以根据api返回,去调用刷新接口。

简单使用就是这样啦。

Tags: Laravel jwt

分享到: