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

路由:

此处注意,我为了方便测试,使用了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.  
  13.   protected function unauthenticated($request, AuthenticationException $exception) 
  14.   { 
  15.     return response()->json(['message' => 'Unauthenticated.'], 401); 
  16.      /*非api可以这么处理 
  17.     return $request->expectsJson() 
  18.           ? response()->json(['message' => 'Unauthenticated.'], 401) 
  19.           : redirect()->guest(route('login')); 
  20.           */ 
  21.   } 
  22. } 

加入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.   /** 
  16.    * Handle an incoming request. 
  17.    * 
  18.    * @param \Illuminate\Http\Request $request 
  19.    * @param \Closure $next 
  20.    * @return mixed 
  21.    */ 
  22.   public function handle($request, Closure $next) 
  23.   {  
  24.     try{ 
  25.       //检查请求中是否带有token 如果没有token值则抛出异常 
  26.       $this->checkForToken($request);  
  27.       if ($request->user = JWTAuth::parseToken()->authenticate()) {     
  28.         return $next($request); 
  29.       } 
  30.       throw new AuthenticationException('Unauthorized', []); 
  31.     }catch (TokenExpiredException $exception){ 
  32.       //返回特殊的code 
  33.       throw new HttpResponseException(response()->json([ 
  34.         'message' => 'token expired' 
  35.       ])); 
  36.     } catch (\Exception $exception) { 
  37.       throw new AuthenticationException('Unauthorized', []); 
  38.     } 
  39.   } 
  40. } 

注册:

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

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

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

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

Laravel配合jwt使用的方法实例

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

简单使用就是这样啦。

Tags: Laravel jwt

分享到: