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 ...
随机推荐
- 让HTML和JSP页面不缓存从Web服务器上重新获取页面
感谢原文作者:佚名 原文链接:https://www.jb51.net/web/100639.html 问题描述 用户退出后,如果点击浏览器上的后退按钮,Web应用将不能正确保护受保护的页面--在Se ...
- 在view中实现UIViewController的跳转 By H.L
view中是不能进行UIViewController的push,pop等操作的,若进行跳转操作,一般是用代理,block,通知等实现,那如何实现在ViewController的subView中实现跳转 ...
- C++中的常见错误
1.变量定义位置错误 1 int sum = 0; 2 3 do 4 { 5 int i = 1; 6 sum += i; 7 i++; 8 }while(i <= 100);//错误:i没有定 ...
- Java枚举使用笔记
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11833790.html Java枚举简单使用示例: package com.shineyue. ...
- iOS 小技巧总结
1.获取准确的app启动所需时间 应用启动时间长短对用户第一次体验至关重要,同时系统对应用的启动.恢复等状态的运行时间也有严格要求,在应用超时的情况下系统会直接关闭应用.以下是几个常见场景下系统对Ap ...
- js金额转中文大写
基础参数: var AIW_number = {0:'零', 1:'壹', 2:'贰', 3:'叁', 4:'肆', 5:'伍', 6:'陆', 7:'柒', 8:'捌', 9:'玖'} var AI ...
- 在MacOS安装puppeteer
安装node:升级:npm i npm 安装yarn:需要注意先把yarn的流程跑完,特别是package.json 安装puppeteer:yarn add puppeteer 安装完成以后需要重启 ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第06章 - 部署kube-apiserver组件
文章目录 1.6.部署kube-apiserver 1.6.0.创建kubernetes证书和私钥 1.6.1.生成kubernetes证书和私钥 1.6.2.创建metrics-server证书和私 ...
- php使用CURL实现GET和POST方式请求
CURL请求,支持GET和POST两种方式,默认为GET方式,如果传第二个参数则为POST方式请求,设置了超时时间,避免程序卡死. /** 使用curl方式实现get或post请求 @param $u ...
- MXNet源码分析 | KVStore进程内通信
本文主要基于MXNet1.6.0版本进行分析. MXNet的KVStore模块下有几个比较重要的类.KVStore是一个抽象类,提供了一些通用的API,例如Init.Push和Pull等.因为KVSo ...