fastadmin加密生成token

server/2025/2/6 18:11:10/

安装git

sudo yum install git

在项目中安装 firebase/php-jwt

composer require firebase/php-jwt

 注意:PHP7.4以上,安装fileinfo

如果还有问题在PHP配置里禁止:

;disable_functions = passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv

后端代码生成token

$payload = array("openId" => $openid,"iat" => time(), // 签发时间"exp" => time() + (60 * 60) // 过期时间,这里设置为1小时
);$token = JWT::encode($payload, $sessionKey, 'HS256');
echo $token;

但这里有问题是,非32位的token


于是有了以下的token生成,两个方法:

$token = JWT::encode($payload, $sessionKey, 'HS256'); 

$token = substr(hash('sha256', uniqid(rand(), true)), 0, 32); 


最后使用思路逻辑是:

生成一个随机32位token,同时存储创建时间和过期时间,

 ===在登陆时,拿缓存中的token对比是否过期,如果过期就重新登陆

 ===重新登陆,用session_key新生成openid,因为openid是不变的,用它找到对应的user_id然后就可以去更新其用户信息和token表的信息,是直接更新,不是重新创建

后端代码:(没有缓存token时,直接用注册信息验证,更新token登陆)

/** 注册/登陆用户信息* 如果有$token就登陆如果没有$token就注册用户信息*/public function getUserInfo(){// 获取得到avatarUrl、nickName、openId,进行存储$data = $this -> app -> encryptor->decryptData($this -> post['session_key'], $this -> post['iv'], $this -> post['encryptedData']);$userModel = new HcdrspUser();$result = $userModel->where('openid', $data['openId'])->find();if(!$result){$userModel->openid = $data['openId'];$userModel->avatarUrl = $data['avatarUrl'];$userModel->name = $data['nickName'];$userModel->status = 'normal';// 创建时间$userModel->createtime = time();$userModel->save();}// 对user_token表处理$user_id = $result['id'];$token = bin2hex(random_bytes(16));$expireTime = time() + (60 * 60 * 12); // 12小时过期时间$createtime = time();$userToken = new UserToken();$token_result = $userToken->where('user_id', $user_id)->find();if($token_result){$userToken -> where('user_id', $user_id) -> update(['token' => $token, 'expiretime' => $expireTime]);$this->success('登陆成功', ['token' => $token,'userinfo' => $result]);}else{$userToken -> token = $token;$userToken -> expiretime = $expireTime;$userToken -> user_id = $user_id;$userToken -> createtime = $createtime;$userToken -> save();$this->success('欢迎新用户', ['token' => $token,'userinfo' => $result]);}}

后端代码:(有缓存token时,验证token并更新token登陆)

/** 登陆验证* 验证token*/public function login(){$token = $this ->request ->post('token');if ($token){$token_result = UserToken::where('token', $token)->find();if($token_result){if ($token_result['expiretime'] < time()){$this->error('登陆过期', $token);}elseif ($token_result['expiretime'] > time()){$user_id = $token_result['user_id'];$token = bin2hex(random_bytes(16));$expireTime = time() + (60 * 60 * 12); // 12小时过期时间$userToken = new UserToken();$userToken -> where('user_id', $user_id) -> update(['token' => $token, 'expiretime' => $expireTime]);$userModel = new HcdrspUser();$result = $userModel->where('id', $user_id)->find();$this->success('登陆成功', $result);}}else{$this->error('登陆失败', $token);}}else{$this->error('请先登陆', $token);}}


http://www.ppmy.cn/server/165477.html

相关文章

大语言模型轻量化:知识蒸馏的范式迁移与工程实践

大语言模型轻量化&#xff1a;知识蒸馏的范式迁移与工程实践 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 摘要 在大型语言模型&#xff…

Java 中 LinkedList 的底层源码

在 Java 的集合框架中&#xff0c;LinkedList是一个独特且常用的成员。它基于双向链表实现&#xff0c;与数组结构的集合类如ArrayList有着显著差异。深入探究LinkedList的底层源码&#xff0c;有助于我们更好地理解其工作原理和性能特点&#xff0c;以便在实际开发中做出更合适…

GWO优化SVM回归预测matlab

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;简称 GWO&#xff09;&#xff0c;是由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出的群智能优化算法。该算法的设计灵感源自灰狼群体的捕食行为&#xff0c;核心思想是对灰狼社会的结构与行为模式进行模仿。 …

基于机器学习鉴别中药材的方法

基于机器学习鉴别中药材的方法 摘要 由于不同红外光照射药材时会呈现不同的光谱特征,所以本文基于中药材的这一特点来判断其产地和种类。 针对问题一&#xff1a;要对附件一中所给数据对所给中药材进行分类&#xff0c;并就其特征和差异性进行研究。首先&#xff0c;我们读…

Python在线编辑器

from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…

当WebGIS遇到智慧文旅-以长沙市不绕路旅游攻略为例

目录 前言 一、旅游数据组织 1、旅游景点信息 2、路线时间推荐 二、WebGIS可视化实现 1、态势标绘实现 2、相关位置展示 三、成果展示 1、第一天旅游路线 2、第二天旅游路线 3、第三天旅游路线 4、交通、订票、住宿指南 四、总结 前言 随着信息技术的飞速发展&…

基于单片机的智能感控杆设计(论文+源码)

2.1功能设计 本次以智能感控杆设计为题&#xff0c;智能感控杆是一种可以应用在多种场合的设备&#xff0c;可以极大的节约人类的精力和时间。在此将其主要功能设计如下&#xff1a; 1.LCD1602液晶显示当前感控杆状态开启/关闭&#xff0c;显示当前模式手动/自动&#xff1b…

基于微信小程序的培训机构客户管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…