Laravel配合jwt使用的方法实例


Posted in PHP onOctober 25, 2020

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

安装

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

配置

生成配置

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

php artisan jwt:secret

auth配置

<?php

return [
 ...

 'defaults' => [
  'guard' => 'web',
  'passwords' => 'users',
 ],


 'guards' => [
  'web' => [
   'driver' => 'session',
   'provider' => 'users',
  ],
  // 使用jwt
  'api' => [
   'driver' => 'jwt',
   'provider' => 'apiUser',
  ],
 ],


 'providers' => [
  ...
  // 指定model
  'apiUser' => [
   'driver' => 'eloquent',
   'model' => App\ApiUser::class,
  ], 
 ],
];

编码

控制器:

<?php

namespace App\Http\Controllers\Api;

use App\ApiUser;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;

class AuthController extends Controller
{
 /**
  * 中间件去除login和refresh
  *
  * @return void
  */
 public function __construct()
 {
  $this->middleware('auth:api', ['except' => ['login','refresh']]);
 }

 /**
  * Get a JWT via given credentials.
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function login(Request $request)
 {
  $credentials = $request->only('phone', 'password');

  if (count($credentials) < 2) {
   return response()->json(['error' => 'Unauthorized'], 401);
  } 

  $user = ApiUser::where('phone', $credentials['phone'])
   ->where('password', md5($credentials['password']))
   ->first();
  if (empty($user) || !$token = JWTAuth::fromUser($user)) {
   return response()->json(['error' => 'Unauthorized'], 401);
  }
  // dd($token);

  return $this->respondWithToken($token);
 }

 /**
  * Get the authenticated User.
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function me()
 {
  return response()->json(auth('api')->user());
 }

 /**
  * Log the user out (Invalidate the token).
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function logout()
 {
  auth()->logout();

  return response()->json(['message' => 'Successfully logged out']);
 }

 /**
  * Refresh a token.
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function refresh()
 {
  return $this->respondWithToken(auth('api')->refresh());
 }

 /**
  * Get the token array structure.
  *
  * @param string $token
  *
  * @return \Illuminate\Http\JsonResponse
  */
 protected function respondWithToken($token)
 {
  return response()->json([
   'access_token' => $token,
   'token_type' => 'bearer',
   'expires_in' => auth('api')->factory()->getTTL() * 60
  ]);
 }
}

路由:

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

// routes/api.php

Route::middleware('api')->prefix('auth')->namespace('Api')->group(function () {
 Route::get('login', 'AuthController@login');
 Route::post('logout', 'AuthController@logout');
 Route::get('refresh', 'AuthController@refresh');
 Route::get('me', 'AuthController@me');
});

测试一下:

Laravel配合jwt使用的方法实例

Laravel配合jwt使用的方法实例

Laravel配合jwt使用的方法实例

unauthenticated处理

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

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Auth\AuthenticationException;

class Handler extends ExceptionHandler
{
  ...

  protected function unauthenticated($request, AuthenticationException $exception)
  {
    return response()->json(['message' => 'Unauthenticated.'], 401);
     /*非api可以这么处理
    return $request->expectsJson()
          ? response()->json(['message' => 'Unauthenticated.'], 401)
          : redirect()->guest(route('login'));
          */
  }
}

加入token refresh

加入中间件代码:

<?php
namespace App\Http\Middleware;
 
use Closure;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Illuminate\Auth\AuthenticationException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Illuminate\Http\Exceptions\HttpResponseException;
use Tymon\JWTAuth\Http\Middleware\BaseMiddleware;

class RefreshToken extends BaseMiddleware
{

  /**
   * Handle an incoming request.
   *
   * @param \Illuminate\Http\Request $request
   * @param \Closure $next
   * @return mixed
   */
  public function handle($request, Closure $next)
  { 
    try{
      //检查请求中是否带有token 如果没有token值则抛出异常
      $this->checkForToken($request); 
      if ($request->user = JWTAuth::parseToken()->authenticate()) {    
        return $next($request);
      }
      throw new AuthenticationException('Unauthorized', []);
    }catch (TokenExpiredException $exception){
      //返回特殊的code
      throw new HttpResponseException(response()->json([
        'message' => 'token expired'
      ]));
    } catch (\Exception $exception) {
      throw new AuthenticationException('Unauthorized', []);
    }
  }
}

注册:

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
  ...
  protected $routeMiddleware = [
    'token.refresh' => \App\Http\Middleware\RefreshToken::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  ];
}

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

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

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

Laravel配合jwt使用的方法实例

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

简单使用就是这样啦。

总结

到此这篇关于Laravel配合jwt使用的文章就介绍到这了,更多相关Laravel配合jwt使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
数据库的日期格式转换
Oct 09 PHP
介绍几个array库的新函数 php
Dec 29 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
ThinkPHP实现动态包含文件的方法
Nov 29 PHP
服务器迁移php版本不同可能诱发的问题
Dec 22 PHP
大家须知简单的php性能优化注意点
Jan 04 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
PHP接口并发测试的方法(推荐)
Dec 15 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
PHP日志LOG类定义与用法示例
Sep 06 PHP
数据结构之利用PHP实现二分搜索树
Oct 25 #PHP
如何运行/调试你的PHP代码
Oct 23 #PHP
php redis setnx分布式锁简单原理解析
Oct 23 #PHP
PHP如何通过带尾指针的链表实现'队列'
Oct 22 #PHP
php使用event扩展的io复用测试的示例
Oct 20 #PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 #PHP
phpcmsv9.0任意文件上传漏洞解析
Oct 20 #PHP
You might like
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
Laravel 队列使用的实现
2019/01/08 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
33种Javascript 表格排序控件收集
2009/12/03 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
使用requestAnimationFrame实现js动画性能好
2015/08/06 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
深入理解JavaScript中的对象复制(Object Clone)
2016/05/18 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
python实现支付宝转账接口
2019/05/07 Python
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
《晏子使楚》教学反思
2014/02/08 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
五一劳动节慰问信
2015/02/14 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js