1.命令创建jwt插件

composer require lcobucci/jwt 3.3

在模块中创建extend/tools/jwt/Token.php   

<?phpnamespace app\login\extend\tools\jwt;use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\ValidationData;class Token
{private static $_config = ['audience' => 'http://www.pyg.com',//接收人'id' => '3f2g57a92aa',//token的唯一标识,这里只是一个简单示例'sign' => 'pinyougou',//签名密钥'issuer' => 'http://adminapi.pyg.com',//签发人'expire' => 3600*24 //有效期];//生成tokenpublic static function getToken($user_id){//签名对象$signer = new Sha256();//获取当前时间戳$time = time();//设置签发人、接收人、唯一标识、签发时间、立即生效、过期时间、用户id、签名$token = (new Builder())->issuedBy(self::$_config['issuer'])->canOnlyBeUsedBy(self::$_config['audience'])->identifiedBy(self::$_config['id'], true)->issuedAt($time)->canOnlyBeUsedAfter($time-1)->expiresAt($time + self::$_config['expire'])->with('user_id', $user_id)->sign($signer, self::$_config['sign'])->getToken();return (string)$token;}//从请求信息中获取token令牌public static function getRequestToken(){if (empty($_SERVER['HTTP_AUTHORIZATION'])) {return false;}$header = $_SERVER['HTTP_AUTHORIZATION'];$method = 'bearer';//去除token中可能存在的bearer标识return trim(str_ireplace($method, '', $header));}//从token中获取用户id (包含token的校验)public static function getUserId($token = null){$user_id = null;$token = empty($token)?self::getRequestToken():$token;if (!empty($token)) {//为了注销token 加以下if判断代码$delete_token = cache('delete_token') ?: [];if(in_array($token, $delete_token)){//token已被删除(注销)return $user_id;}$token = (new Parser())->parse((string) $token);//验证token$data = new ValidationData();$data->setIssuer(self::$_config['issuer']);//验证的签发人$data->setAudience(self::$_config['audience']);//验证的接收人$data->setId(self::$_config['id']);//验证token标识if (!$token->validate($data)) {//token验证失败return $user_id;}//验证签名$signer = new Sha256();if (!$token->verify($signer, self::$_config['sign'])) {//签名验证失败return $user_id;}//从token中获取用户id$user_id = $token->getClaim('user_id');}return $user_id;}
}

 2.在模块下的commen文件下封装返回的fail(错误),和success方法(成功)。

<?php
// 应用公共文件
if (!function_exists('success'))
{function success($code = '200',$msg = 'ok',$data=''){return json(['code'=>$code,'msg'=>$msg,'data'=>$data,]);}
}if (!function_exists('fail'))
{function fail($code = 500,$msg = '',$data=''){return json(['code'=>500,'msg'=>$msg,'data'=>$data,]);}
}

3.创建登录模块、以及控制器、以及独立验证器验证数值是否符合规范

php think make:validate Login@login

php think build Login

4.使用模型或者DB类查询出登录的账号以及密码进行判断

5.登录成功使用模型关联根据id查询出对应的权限。

纠正一下:这里吧admin表给替换成user表

创建以上对应的五个模型

 注:中间表一定要继承 pivot!!!

$adminInfo = \app\Login\model\User::with(['role','Role.auth'])->find($adminInfo['id'])->toArray();$authList = $adminInfo['Role'][0]['auth'];$authArr = [];
foreach ($authList as $value) {$authArr[] = $value['auth_c'].'/'.$value['auth_a'];
}
cache('auth_list',$authArr);
$data = ['token' => Token::getToken($adminInfo['id'])
];return success('200','登录成功',$data);

查询权限之后存放至缓存,并返回登录成功获取token

cache('auth_list',$authArr);

6.想要获取token的值需要在public目录下的.htaccess文件里加上以下代码

RewriteCond  %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

7.创建中间件,验证权限是否符合

php think make:middleware Login@handle

中间件代码:(从缓存中获取存入的控制器方法,进行判断是否在这个数组里,如果存在则登录成功,如果不存在则没有此权限)

<?php
declare (strict_types = 1);namespace app\Login\middleware;use RuntimeException;use app\login\extend\tools\jwt\Token;class handle
{/*** 处理请求** @param \think\Request $request* @param \Closure       $next* @return Response*/public function handle($request, \Closure $next){try {# 判断token是否存在、并且保证token是有效的才能访问#  获取token$token = Token::getRequestToken();if (!$token) {return  fail('','请先登录');}# 验证token$user_id = Token::getUserId($token);if (!is_numeric($user_id)){return  fail('','token失效');}if (!$user_id) {return  fail('','token失效');}# 权限检测# controller()获取当前访问的控制器名a# action()获取当前访问的方法名$current = $request->controller().'/'.$request->action();$authList = cache('auth_list');# 获取缓存中的权限列表if (!in_array($current,$authList) && $user_id != 1) {return  fail('','无权限访问');}# token 认证成功、并且有权限访问return $next($request);}catch (RuntimeException $exception){return  fail('','token 无效');}}
}

在这里涉及到如果id为1(超级管理员),可以直接获取id判断是否不等于1,如果不等1的话可以直接跳过,不用验证token

下面就直接在路由里引用中间件就可以了

tp6登录JWT获取token并认证相关推荐

  1. 【java】基于JWT的token身份认证方案

    1.概述 转载:基于JWT的token身份认证方案 2.使用JSON Web Token的好处 2.1 性能问题 验证信息可以由前端保存,后端不需要为保存token消耗内存.JWT方式将用户状态分散到 ...

  2. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebService服务中可以通过SoapHead验证机制 ...

  3. 【十四】无验证码登录配置:通过登录接口获取 token 配置全局变量

    目录 一.基本配置 二.用户定义的变量 三.用户参数 四.HTTP 请求默认值 五.HTTP 信息头管理器 六.监听器 七.登录线程组 (1)HTTP 请求:登录接口 (2) 察看结果树 (3)Jso ...

  4. uniapp实现小程序登录,微信一键登录,获取token,iv,code,ncryptedData

    首先布局登录按钮(触发登录的一定要是button,button才有获取用户的方法) <buttonopen-type="getPhoneNumber"@click.stop= ...

  5. VUE+SpringBoot+JWT实现token验证,SSO单点登录

    Session的产生: 在说session是啥之前,我们先来说说为什么会出现session会话,它出现的机理是什么?我们知道,我们用浏览器打开一个网页,用到的是HTTP协议,htpp协议是无状态的,什 ...

  6. 微信小程序自动注册获取token

    小程序 app.js import {Cache } from './utils/cache.js'; const cache = new Cache(7200) // app.js App({onL ...

  7. SpringBoot 整合 JWT 实现 Token 验证

    前言 在Spring Security整合oauth2实现认证token也不满足实际生产需求的时候,可以整合Jwt实现token认证,完全手写获取token,认证token的方法. Maven依赖包 ...

  8. WebApi后端框架Token身份认证,Api接口Token验证

    令牌概述(Token) 在以用户账号体系作为安全认证的信息系统中,对用户身份的鉴定是非常重要的事情. 令牌机制是软件系统安全体系中非常重要的部分,在计算机身份认证中是令牌的意思,一般作为邀请.登录以及 ...

  9. postman使用教程(3)--获取token

    有些接口必须输入参数token后才能调用,本章主要记录下如何用postman获取token并引用 一.登录接口获取token 首先,我们先调用登录接口去获取token 调用登录接口成功后会发现返回值中 ...

最新文章

  1. Pycharm上传Gitlab
  2. RHCE认证培训+考试七天实录(二)
  3. java内存模型之一
  4. [转] UML类图的几种关系总结
  5. Directory Service Maintenance
  6. python 月活_TikTok用户月活超1亿意味着什么?什么是月活用户?
  7. E:Three Blocks Palindrome(hard and easy)(树状数组 ? 前缀和?)
  8. linux 查看链接最终目标,linux学习笔记7-链接
  9. 基于交换机的PC端网络通信
  10. python计算二维平面的曲线的曲率
  11. bzoj 1070: [SCOI2007]修车【最小费用最大流】
  12. C++11 显示类型转换
  13. 微信小程序API之request
  14. 网络配置问题Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization.
  15. qq授权登录。微信授权登录、微博授权登录
  16. 第六届中国Linux内核开发者大会
  17. C语言——三位数的百位,十位,个位分别输出
  18. EA将向内政及手机游戏开辟商供应发行办事
  19. 采用Resnet做UC Merced Land Use Dataset数据分类
  20. 编程软件IAR安装使用及程序下载

热门文章

  1. unity2D备忘志(二)
  2. 数据结构与算法学习(第一天 循环队列)
  3. 如何在PPT中添加答案(课件)
  4. 让烦人的弹窗广告消失操作
  5. 联想拯救者快速找到系统变量设置
  6. zabbix监控交换机流量详细方法
  7. ITK在写图像文件时发生异常的解决方法
  8. Thread类源码解读2--线程状态及常用方法
  9. python 中文转拼音原理_Python_ jieba、snownlp中文分词、Pinyin中文转拼音
  10. 浏览器卷去的高度固定 js