根据博客进行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创建和验证的更多相关文章

  1. JSON WEB Token(JWT)

    最近面试被问及单点登陆怎么解决?自己的项目前后端分离,自己实现token认证,token有失效时间,token中包含用户基本的信息.且一个当用户重新登陆后,原来的token就会失效,这么安全的一个to ...

  2. JSON Web Token (JWT) 简介

    JSON Web Token (JWT) 是一种基于 token 的认证方案. JSON Web Token 的结构 一个 JWT token 看起来是这样的: eyJhbGciOiJIUzI1NiI ...

  3. JSON Web Token (JWT) 实现与使用方法

    1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...

  4. Json Web Token(JWT)详解

    什么是Json Web Token Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的 ...

  5. JSON Web Token (JWT),服务端信息传输安全解决方案。

    JWT介绍 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑独立的基于JSON对象在各方之间安全地传输信息的方式.这些信息可以被验证和信任,因为它是数字签名的 ...

  6. 漫谈JSON Web Token(JWT)

    一.背景 传统的单体应用基于cookie-session的身份验证流程一般是这样的: 用户向服务器发送账户和密码. 服务器验证账号密码成功后,相关数据(用户角色.登录时间等)都保存到当前会话中. 服务 ...

  7. 基于 Token 的身份验证:JSON Web Token(JWT)

    1.传统身份验证和JWT的身份验证 传统身份验证:       HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...

  8. JSON Web Token (JWT) - Introduction

    To validate the challenge, connect as admin.------------以admin登陆 https://jwt.io/introduction/        ...

  9. JSON Web Token (JWT)生成Token及解密实战。

    昨天讲解了JWT的介绍.应用场景.优点及注意事项等,今天来个JWT具体的使用实践吧. 从JWT官网支持的类库来看,jjwt是Java支持的算法中最全的,推荐使用,网址如下. https://githu ...

随机推荐

  1. WinForms 获取文件夹的基本信息

    1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Da ...

  2. Vue 面试题

    1.Vue父组件向子组件传递数据? 答:props传参 父组件 <child :list="list"></child> //在这里绑定list对象 子组件 ...

  3. 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足

    前言 PC网页吊起支付宝支付界面报了如下这么个错误: 我明明申请的支付宝支付功能列表的签约已经生效了呀!怎么回事呢? 解决 支付宝商户中心:https://b.alipay.com/signing/p ...

  4. js 保护网站

    转载请注明来源:https://www.cnblogs.com/hookjc/ <!--禁止鼠标右键代码--><noscript><iframe src=*.html&g ...

  5. JavaWeb编码浅解

    感谢原文作者:少年无形 原文链接:https://blog.csdn.net/dl18215164175/article/details/72512131?depth_1-utm_source=dis ...

  6. tabbar选中按钮的标题颜色和字体

    @implementation XMGTabBarController /* 问题: 1.选中按钮的图片被渲染 -> iOS7之后默认tabBar上按钮图片都会被渲染 1.修改图片 2.通过代码 ...

  7. linux实用技巧:在虚拟机vmware16软件上安装CentOs8.2虚拟机,重置可用源和安装输入法

    前言   开发服务器应用,需要使用到CentOs8.2,安装到虚拟机上方便快捷.   提前准备 Vmware 16虚拟机软件  下载VM16版本及以上的vmware虚拟机版本,否则没有CentOs8选 ...

  8. 微服务从代码到k8s部署应有尽有系列(一)

    从本篇文章开始,我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 实战项目地址:https://github.com/Mikaelemmmm/go-zer ...

  9. 基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版

    技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达 ...

  10. 1、Oauth概念与模式

    参考 OAuth 2.0 的一个简单解释