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 动态执行带有参数的类方法
Apr 10 PHP
PHP源码之 ext/mysql扩展部分
Jul 17 PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
Jun 05 PHP
解析posix与perl标准的正则表达式区别
Jun 17 PHP
PHP 快速排序算法详解
Nov 10 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
PHP常用字符串函数小结(推荐)
Aug 05 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 PHP
php模拟post提交请求调用接口示例解析
Aug 07 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
基于Zookeeper的使用详解
2013/05/02 PHP
浅谈PHP接收POST数据方式
2015/06/05 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
javascript 面向对象编程基础 多态
2009/08/21 Javascript
jquery 最简单的属性菜单
2009/10/08 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
浅谈layui 绑定form submit提交表单的注意事项
2019/10/25 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
一个超级简单的python web程序
2014/09/11 Python
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
解决Python requests 报错方法集锦
2017/03/19 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
python 整数越界问题详解
2019/06/27 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
2019/08/29 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
经济管理专业毕业生推荐信
2013/11/11 职场文书
升职自荐书范文
2013/11/28 职场文书
九年级物理教学反思
2014/01/29 职场文书
保密工作目标责任书
2014/07/28 职场文书
javaScript Array api梳理
2021/03/31 Javascript
python tkinter实现定时关机
2021/04/21 Python