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 mysql 判断update之后是否更新了的方法
Jan 10 PHP
解析wamp5下虚拟机配置文档
Jun 27 PHP
php实现下载限制速度示例分享
Feb 13 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
php通过修改header强制图片下载的方法
Mar 24 PHP
php准确计算复活节日期的方法
Apr 18 PHP
使用URL传输SESSION信息
Jul 14 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
May 16 PHP
php 使用fopen函数创建、打开文件详解及实例代码
Sep 24 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
Feb 23 PHP
Laravel5.1 框架响应基本用法实例分析
Jan 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
用phpmyadmin更改mysql5.0登录密码
2008/03/25 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
2020/08/24 PHP
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
JS高级运动实例分析
2016/12/20 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
python解析基于xml格式的日志文件
2017/02/25 Python
Django实现自定义404,500页面教程
2017/03/26 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
化工专业大学生职业生涯规划书
2014/01/14 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
私人委托书格式
2014/09/10 职场文书
2015羊年春节慰问信
2015/02/14 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
小数乘法教学反思
2016/02/22 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书