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 相关文章推荐
PHP中对缓冲区的控制实现代码
Sep 29 PHP
在PHP上显示JFreechart画的统计图方法
Nov 03 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 PHP
php中实现精确设置session过期时间的方法
Jul 17 PHP
php实现的Cookies操作类实例
Sep 24 PHP
利用php输出不同的心形图案
Apr 22 PHP
php实现表单提交上传文件功能
May 28 PHP
Swoole实现异步投递task任务案例详解
Apr 02 PHP
浅谈PHP array_search 和 in_array 函数效率问题
Oct 15 PHP
laravel清除视图缓存的代码
Oct 23 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
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
使用js实现雪花飘落效果
2013/08/26 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
Vue项目安装插件并保存
2019/01/28 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
python实现两个文件合并功能
2018/04/01 Python
Python设计模式之装饰模式实例详解
2019/01/21 Python
python程序变成软件的实操方法
2019/06/24 Python
北美女性服装零售连锁店:maurices
2019/06/12 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
什么时候需要进行强制类型转换
2016/09/03 面试题
护士实习自我鉴定
2013/10/22 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
倡议书的格式写法
2015/04/28 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技