json web token JWT实现TP5创建和验证
根据博客进行jwt初始化配置
https://blog.csdn.net/weixin_43389208/article/details/117442266?spm=1001.2014.3001.5501
https://www.cnblogs.com/anhan/p/14954953.html
1.composer 安装JWT
composer require lcobucci/jwt 3.3
2.在extend/tools/jwt创建Token.php
注意:如果没有该目录,则自行创建。

3.
Token.php书写以下代码
自写代码:
<?php namespace tools\jwt; use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Parser;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\ValidationData; class Token
{
public static function createToken($uid = null)
{
$signer = new Sha256();//加密规则
$time = time();//当前时间
$token = (new Builder())
->issuedBy('teacher')//签发人
->canOnlyBeUsedBy('student')//接收人
->identifiedBy('MarsLei', true) //标题id
->issuedAt($time)//发出令牌的时间
->canOnlyBeUsedAfter($time) //生效时间(即时生效)
->expiresAt($time + 3600) //过期时间
->with('uid', $uid) //用户id
->sign($signer, 'my') //签名
->getToken(); //得到token
return (string)$token;
}
//在框架中对JWT解密方法进行封装。 public static function verifyToken($token=null){
//检测是否接收到了token
if(empty($token)){
return 0;
}
//转化为可以验证的token
$token = (new Parser())->parse((string) $token);
//验证基本设置
$data = new ValidationData();
$data->setIssuer('teacher');
$data->setAudience('student');
$data->setId('MarsLei'); if(!$token->validate($data)){
return 0;
}
//验证签名
$signer = new Sha256();
if(!$token->verify($signer, 'my')){
return 0;
}
//验证通过,返回用户id
return $token->getClaim('uid');
} }
重新引用以下代码,以防止报错:

书写登录表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="http://apps.bdimg.com/libs/bootstrap/3.3.0/css/bootstrap.min.css">
</head>
<body>
<div style="width: 300px">
<div class="form-group">
<label for="name">名称</label>
<input type="text" class="form-control account" name="account" >
</div>
<div class="form-group">
<label for="name">密码</label>
<input type="password" class="form-control password" name="password" >
</div>
<input type="hidden" name="__token__" value="{$Request.token}" />
<input type="button" id="login" value="立即登录">
</div>
</body>
</html>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
</script>
<script>
$('#login').click(function (){
var account =$('.account').val();
var password=$('.password').val();
var token=localStorage.getItem('token');
$.ajax({
url:'/ajax/login/loginSuccess',
type:'POST',
headers:{
Authorization:token,
}, data:{
account:account,
password:password,
__token__:"{$Request.token}",
},
dataType:'json',
success:function (res){
console.log(res);
if (res.code==200){
alert('登录成功');
//将用户res里的Token存入在本地
localStorage.setItem('token',res.data.token);
location.href='/ajax/ajax/index?token='+token;
}
}
})
}) </script>
切记,页面路由跳转是要携带token,由基类判断是否携带token

在模块下新创建一个Base基类控制器,书写判断代码,用于其他控制器的继承。

<?php namespace app\ajax\controller; use think\Controller;
use think\Request;
use tools\jwt\Token; class Base extends Controller
{
//
public function __construct(Request $request = null)
{
parent::__construct($request); //接收token
$token=input('token');
//判断$token,如果是空的,返回登录界面
if (empty($token)){
$this->error('缺少token参数,请先登录','/ajax/login/login');
}
//验证token
$userId=Token::verifyToken($token);
if (!$userId){
$this->error('token参数失效,请先登录','/ajax/login/login');
} }
}
控制器继承基类控制器

登录控制器调用Token,记录用户的id
//生成token
$token = Token::createToken($userInfo['id']); //生成token
<?php namespace app\ajax\controller; use app\ajax\model\AjaxModel;
use think\Controller;
use think\Session;
use tools\jwt\Token; class Login extends Controller
{
//展示登录页面
public function login(){
return view();
} public function loginSuccess(){
$params = $this->request->post();
//验证user表是否与用户输入的信息向匹配
$data = AjaxModel::getLogininfo($params);
if ($params['account'] != $data['username']) {
$this->error('账号输入错误', '/ajax/ajax/create');
}
if ($params['password'] != $data['userpassword']) {
$this->error('密码输入错误', '/ajax/ajax/create');
}
//生成token令牌
$token = Token::createToken($data['id']);
//将令牌放在session中
Session::set('token',$token);
$data['token']=$token;
//查看用户权限
$id=$data['id'];
$userNode= AjaxModel::getUserNodeALL($id);
//模型层级完成后将数据记录到session中
Session::set('userNode',$userNode);
return getJsonData(200,'success', $token);
}
}
json web token JWT实现TP5创建和验证的更多相关文章
- JSON WEB Token(JWT)
最近面试被问及单点登陆怎么解决?自己的项目前后端分离,自己实现token认证,token有失效时间,token中包含用户基本的信息.且一个当用户重新登陆后,原来的token就会失效,这么安全的一个to ...
- JSON Web Token (JWT) 简介
JSON Web Token (JWT) 是一种基于 token 的认证方案. JSON Web Token 的结构 一个 JWT token 看起来是这样的: eyJhbGciOiJIUzI1NiI ...
- JSON Web Token (JWT) 实现与使用方法
1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...
- Json Web Token(JWT)详解
什么是Json Web Token Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的 ...
- JSON Web Token (JWT),服务端信息传输安全解决方案。
JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式.这些信息可以被验证和信任,因为它是数字签名的 ...
- 漫谈JSON Web Token(JWT)
一.背景 传统的单体应用基于cookie-session的身份验证流程一般是这样的: 用户向服务器发送账户和密码. 服务器验证账号密码成功后,相关数据(用户角色.登录时间等)都保存到当前会话中. 服务 ...
- 基于 Token 的身份验证:JSON Web Token(JWT)
1.传统身份验证和JWT的身份验证 传统身份验证: HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...
- JSON Web Token (JWT) - Introduction
To validate the challenge, connect as admin.------------以admin登陆 https://jwt.io/introduction/ ...
- JSON Web Token (JWT)生成Token及解密实战。
昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...
随机推荐
- bom案例4-模拟滚动条
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Ubuntu安装 php + apache + mysql
转载请注明来源:https://www.cnblogs.com/hookjc/ 1.安装SSH(必须) sudo apt-get install ssh 2.安装MySQL(虽然现在最新版为5.1,但 ...
- 利用纯代码写出一个秒表表盘的方法 —— #DF
@interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...
- 直播流媒体EasyDSS
访问官方 http://www.easydss.com/ 点击试用下载 根据不同需求 选择不同版本 (我选择的右边) 下载完解压 双击 start.bat 看见如下图则成功 网页输入 http://i ...
- LinkedHashSet、Map、Map接口HashMap、Hashtable,TreeSet、TreeMap、如何选择使用集合实现类,Collections工具类
一.Set接口实现类LinkedHashSet 实现继承图: 1.LinkedHashSet的全面说明 1) LinkedHashSet是 HashSet的子类 2) LinkedHashSet底层是 ...
- Sunlogin RCE漏洞分析和使用
介绍 前两天网上曝出了关于向日葵远控工具(Sunlogin)Windows个人版的RCE漏洞POC.因为利用简单并且网上出现了公开的自动化扫描脚本,所以测试的人很多,也出现了一些真实攻击.漏洞的问 ...
- CentOS7防火墙firewall
一.Firewall 1. 从CentOS7开始,默认使用firewall来配置防火墙,没有安装iptables(旧版默认安装). 2. firewall的配置文件是以xml的格式,存储在 /usr/ ...
- 创建jsp页面出现The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path错误
原因未添加tomcat服务器 第一步: 第二步:
- 【axios三部曲】一、使用axios
axios作为一个基于promise的网络请求库,它同时支持浏览器和node环境,是我们开发中常用的一个库 它的一些特性: 从浏览器发出XMLHttpRequests 从node.js发出http ...
- virtualenv 创建隔离工作环境
在开发 Python 应用程序的时候,每个项目所需要的python版本和各种包依赖都可能不完全一样,我们当然希望当前运行环境只包含对当前项目有用的包依赖,以保证运行环境的干净.virtualenv就是 ...