tp6登录JWT获取token并认证
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并认证相关推荐
- 【java】基于JWT的token身份认证方案
1.概述 转载:基于JWT的token身份认证方案 2.使用JSON Web Token的好处 2.1 性能问题 验证信息可以由前端保存,后端不需要为保存token消耗内存.JWT方式将用户状态分散到 ...
- ASP.NET WebApi 基于JWT实现Token签名认证
一.前言 开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebService服务中可以通过SoapHead验证机制 ...
- 【十四】无验证码登录配置:通过登录接口获取 token 配置全局变量
目录 一.基本配置 二.用户定义的变量 三.用户参数 四.HTTP 请求默认值 五.HTTP 信息头管理器 六.监听器 七.登录线程组 (1)HTTP 请求:登录接口 (2) 察看结果树 (3)Jso ...
- uniapp实现小程序登录,微信一键登录,获取token,iv,code,ncryptedData
首先布局登录按钮(触发登录的一定要是button,button才有获取用户的方法) <buttonopen-type="getPhoneNumber"@click.stop= ...
- VUE+SpringBoot+JWT实现token验证,SSO单点登录
Session的产生: 在说session是啥之前,我们先来说说为什么会出现session会话,它出现的机理是什么?我们知道,我们用浏览器打开一个网页,用到的是HTTP协议,htpp协议是无状态的,什 ...
- 微信小程序自动注册获取token
小程序 app.js import {Cache } from './utils/cache.js'; const cache = new Cache(7200) // app.js App({onL ...
- SpringBoot 整合 JWT 实现 Token 验证
前言 在Spring Security整合oauth2实现认证token也不满足实际生产需求的时候,可以整合Jwt实现token认证,完全手写获取token,认证token的方法. Maven依赖包 ...
- WebApi后端框架Token身份认证,Api接口Token验证
令牌概述(Token) 在以用户账号体系作为安全认证的信息系统中,对用户身份的鉴定是非常重要的事情. 令牌机制是软件系统安全体系中非常重要的部分,在计算机身份认证中是令牌的意思,一般作为邀请.登录以及 ...
- postman使用教程(3)--获取token
有些接口必须输入参数token后才能调用,本章主要记录下如何用postman获取token并引用 一.登录接口获取token 首先,我们先调用登录接口去获取token 调用登录接口成功后会发现返回值中 ...
最新文章
- Pycharm上传Gitlab
- RHCE认证培训+考试七天实录(二)
- java内存模型之一
- [转] UML类图的几种关系总结
- Directory Service Maintenance
- python 月活_TikTok用户月活超1亿意味着什么?什么是月活用户?
- E:Three Blocks Palindrome(hard and easy)(树状数组 ? 前缀和?)
- linux 查看链接最终目标,linux学习笔记7-链接
- 基于交换机的PC端网络通信
- python计算二维平面的曲线的曲率
- bzoj 1070: [SCOI2007]修车【最小费用最大流】
- C++11 显示类型转换
- 微信小程序API之request
- 网络配置问题Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization.
- qq授权登录。微信授权登录、微博授权登录
- 第六届中国Linux内核开发者大会
- C语言——三位数的百位,十位,个位分别输出
- EA将向内政及手机游戏开辟商供应发行办事
- 采用Resnet做UC Merced Land Use Dataset数据分类
- 编程软件IAR安装使用及程序下载