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 默默经典版本
Aug 04 PHP
php 无限分类的树类代码
Dec 03 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
PHP截断标题且兼容utf8和gb2312编码
Sep 22 PHP
php中的观察者模式简单实例
Jan 20 PHP
Yii实现单用户博客系统文章详情页插入评论表单的方法
Dec 28 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
laravel 实现划分admin和home 模块分组
Oct 15 PHP
Laravel 简单实现Ajax滚动加载示例
Oct 22 PHP
PHP连续签到功能实现方法详解
Dec 04 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新手上路(五)
2006/10/09 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
php实现微信支付之企业付款
2018/05/30 PHP
php让json_encode不自动转义斜杠“/”的方法
2020/04/27 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
2014/09/09 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
Python实现元素等待代码实例
2019/11/11 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
python如何获取apk的packagename和activity
2020/01/10 Python
大学同学聚会邀请函
2014/01/19 职场文书
《问银河》教学反思
2014/02/19 职场文书
婚礼司仪主持词
2014/03/14 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
2014年后勤工作总结
2014/11/18 职场文书
灵魂歌王观后感
2015/06/17 职场文书
物业保洁员管理制度
2015/08/05 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
MySQL 查询速度慢的原因
2021/05/25 MySQL