php使用jwt作登录验证

news2024/11/25 4:29:52

1 在项目根目录下,安装jwt

composer require firebase/php-jwt

2 在登录控制器中加入生成token的代码

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class Login extends Cross
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index(Request $request)
    {
        try{
            validate(LoginValidate::class)->scene('login')->check($this->request->param());
            $params = $request->param();
            $db = new UserModel();
            $result = $db->where("username='{$params['username']}' AND password='{$params['password']}'")->find();
            if(!empty($result)){
                $key = '!@#$%*&';         //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当于加密中常用的 盐  salt
                $token = array(
                    "iss" => $key,        //签发者 可以为空
                    "aud" => '',          //面象的用户,可以为空
                    "iat" => time(),      //签发时间
                    "nbf" => time() + 3,  //在什么时候jwt开始生效  (这里表示生成100秒后才生效)
                    "exp" => time() +200, //token 过期时间
                    "user_id" => $result['id']       //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
                );
                $jwt = JWT::encode($token, $key, 'HS256');
                $this->response(200,"登录成功",['token'=>$jwt]);
            }else{
                $this->response(401,"用户名或者密码错误");
            }
        }catch (Exception $exception){
            return $this->response(400,"请输入完整的信息",$exception->getMessage());
        }

    }
    


}

 可以看到返回token

3  创建一个checkToken类进行解密

<?php

namespace app\api\controller;

use think\Controller;
use think\Request;
use app\api\controller\Cross;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class CheckToken extends Cross
{

    protected $user_id;
    protected function initialize()
    {
        parent::initialize(); // TODO: Change the autogenerated stub
//        解密token,存储用户id;
        $key = '!@#$%*&';
        $token =  request()->header('token');
        if(empty($token)){
            $this->response(300,"你还没有登录");
        }
        try {
            JWT::$leeway = 60; //当前时间减去60,把时间留点余地
            $key = new Key($key, 'HS256');

            $decoded = JWT::decode($token, $key); //HS256方式,这里要和签发的时候对应
            $arr = (array)$decoded;
            $this->user_id= $arr['user_id'];
        } catch (Firebase\JWT\SignatureInvalidException $e) { //签名不正确

            $this->response(301,"签名不正确");
        } catch (Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
            $this->response(301,"token失效");

        } catch (Firebase\JWT\ExpiredException $e) { // token过期
            $this->response(301,"token失效");
        } catch (Exception $e) { //其他错误
            $this->response(301,"未知错误");
        }

    }

}

 所有需要登录操作的接口,都继承这个类

<?php

namespace app\api\controller;

use app\api\controller\CheckToken;
use think\Controller;
use think\Request;

class Home extends CheckToken
{
    public function index(){
        $this->response(200,'成功',$this->user_id);
    }
}

 在前端请求拦截器中,将获得的token设置为请求头

 即可看到打印出来了用户id

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在贸易发展新时代,我为什么推荐你使用全渠道支持平台?

在当今世界&#xff0c;客户希望在与企业互动时获得无缝体验&#xff0c;无论他们使用什么渠道进行联系。这就是全渠道支持的用武之地。通过提供全渠道客户支持&#xff0c;企业可以满足客户期望并提高客户满意度。在本文中&#xff0c;我们将探讨它的好处以及认识全渠道客户沟…

前人栽树,后人才能乘凉!聊聊低代码对开发者的意义

一、低代码很火 LCDP&#xff08;低代码开发平台&#xff09;市场规模大&#xff0c;增长迅速。Gartner机构的预测&#xff0c;到2025年&#xff0c;企业70%的新应用将会通过低代码或者无代码技术开发&#xff0c;这将加快低代码市场的全面爆发。而另外一家研究机构海比研究院数…

YOLOv5:对yolov5n模型进一步剪枝压缩

YOLOv5&#xff1a;对yolov5n模型进一步剪枝压缩 前言前提条件相关介绍具体步骤修改yolov5n.yaml配置文件单通道数据&#xff08;黑白图片&#xff09;修改models/yolo.py文件修改train.py文件 剪枝后模型大小 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;…

2023高教社杯数学建模国赛题目这样选择

2023高教社杯数学建模国赛题目如何选择 一年一度的数学建模国赛要来啦&#xff01;&#xff01;&#xff01;小编仔细阅读了比赛官方网站上的规则和要求&#xff0c;以及比赛的题型和时间安排&#xff0c;现总结分享给大家。小编将会在开赛后第一时间发布选题建议、所有题目的…

Leetcode - 112双周赛

一&#xff0c;2839. 判断通过操作能否让字符串相等 I ​ 该题的题意就是看 单数下标 和 偶数下标的 s1 和 s2 中的字母及其数量是否相等。 代码如下(也可以使用哈希表来做)&#xff1a; class Solution {public boolean canBeEqual(String s1, String s2) {int[] a new in…

Debian11安装Geoserver+矢量插件

呕心之作&#xff0c;小白教程 1 安装 Java 112 安装Geoserver2.1 安装2.2 设置自启动2.3 跨域问题 3 安装矢量插件 Geoserver的官网安装手册。 GeoServer需要 Java 8 或者 Java 11 环境 1 安装 Java 11 Debain默认安装 Java 11 版本&#xff0c;直接执行&#xff1a; # 确认…

​​​​​​​程序流程图怎么画?几步教你快速绘制流程图

程序流程图怎么画&#xff1f;在工作中&#xff0c;我们经常需要向同事或者客户展示我们的工作流程&#xff0c;让他们对我们的工作有更全面的了解和认识。此时&#xff0c;流程图就成为了一个非常有用的工具&#xff0c;通过它&#xff0c;我们可以将复杂的工作流程清晰地展示…

华为云云服务器评测|华为云耀云L搭建zerotier服务测试

0. 环境 - Win10 - 云耀云L服务器 1. 安装docker 检查yum源&#xff0c;本EulerOS的源在这里&#xff1a; cd /etc/yum.repos.d 更新源 yum makecache 安装 yum install -y docker-engine 运行测试 docker run hello-world 2. 运行docker镜像 默认配…

Spring6.1之RestClient分析

文章目录 1 RestClient1.1 介绍1.2 准备项目1.2.1 pom.xml1.2.2 创建全局 RestClient1.2.3 Get接收数据 retrieve1.2.4 结果转换 Bean1.2.5 Post发布数据1.2.6 Delete删除数据1.2.7 处理错误1.2.8 Exchange 方法 1 RestClient 1.1 介绍 Spring 框架一直提供了两种不同的客户端…

DataX(MySQL同步数据到Doris)

1.场景 这里演示介绍的使用 Doris 的 Datax 扩展 DorisWriter实现从Mysql数据定时抽取数据导入到Doris数仓表里 2.编译 DorisWriter 这个的扩展的编译可以不在 doris 的 docker 编译环境下进行&#xff0c;本文是在 windows 下的 WLS 下进行编译的 首先从github上拉取源码 …

升哲科技城市级“算力+数字底座”服务亮相2023服贸会

9月2日至6日&#xff0c;以“开放引领发展&#xff0c;合作共赢未来”为主题的2023年中国国际服务贸易交易会在北京隆重举办。作为城市级数据服务商&#xff0c;升哲科技&#xff08;SENSORO&#xff09;连续第四年参加服贸会&#xff0c;携城市级“算力数字底座”服务及在城市…

语音芯片WTN6的驱动

前言 &#xff08;1&#xff09;本系列是基于STM32的项目笔记&#xff0c;内容涵盖了STM32各种外设的使用&#xff0c;由浅入深。 &#xff08;2&#xff09;小编使用的单片机是STM32F105RCT6&#xff0c;项目笔记基于小编的实际项目&#xff0c;但是博客中的内容适用于各种单片…

java八股文面试[数据库]——MySQL中事务的特性

在关系型数据库管理系统中&#xff0c;一个逻辑工作单元要成为事务&#xff0c;必须满足这 4 个特性&#xff0c;即所谓的 ACID&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持…

[移动通讯]【Carrier Aggregation-3】【5G】

前言&#xff1a; 参考&#xff1a; 5G Mobile Communications&#xff1a;《Carrier Aggregation in 5G》 目录&#xff1a; 1&#xff1a; carrier Allocation Schemes 2&#xff1a; 网络结构 3&#xff1a; LTE CA 4: 5G CA 一 Carrier Allocation Schemes CA 主要作用…

问脉基础调研

基本功能&#xff1a; 资产清点 清点镜像、镜像软件资产数据与详细信息清点容器、应用软件资产数据与详细信息清点集群、Pod、Service、Ingress、Secrets 等数十种资产数据与详细信息提供资产与资产、资产与事件关联查看提供仪表盘总览当前检测对象数据情况 镜像安全 镜像漏…

Text文件在MATLAB中读写示例基础

背景 为了便于和外部程序进行交换&#xff0c;以及查看文件中的数据&#xff0c;也常常采用文本数据格式与外界交换数据。在文本格式中&#xff0c;数据采用ASCII码格式&#xff0c;可以使用字母和数字字符。可以在文本编辑器中查看和编辑ASCII文本数据。MATLAB提供了导入函数…

raise EOFError(“No data left in file“) EOFError: No data left in file

在linux服务器里跑分割模型的时候出现了以下错误&#xff0c;但是在自己电脑上运行相同程序时没有错误&#xff0c;可以运行。 ise EOFError(“No data left in file”) EOFError: No data left in file 到底是因为什么&#xff1f; GPT给的回答&#xff1a; “EOFError: No …

3dMax全球学习资源、资源文件和教程 !

此样例教育教程和学习资源旨在提供使用Autodesk 3ds Max时的计划知识和培训、正确的工作流、流程管理和最佳实践。 您在Autodesk三维设计领域的职业生涯 有关使用3ds Max和Maya在计算机图形领域开始职业生涯的提示&#xff08;包括新的3ds Max和Maya介绍教程&#xff0c;以复…

js reduce求和

let unReadCount resultList.reduce((pre, cur) > {return pre cur.unReadCount}, 0)

自动气象站:无线数据传输、多场景应用

自动气象站能够和环境监控云平台组成气象环境监控系统&#xff0c;能够全天候无人值守地监测气象要素&#xff0c;实现实时监测和数据传输&#xff0c;具有多要素集成、无线数据传输、多场景应用的优势。 一、自动气象站可以全天候不间断地监测空气温度、湿度、大气压力、雨量…