fastadmin加密生成token

安装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);
        }
    }
相关推荐
UrbanJazzerati2 小时前
AutoHotkey v2 零基础快速入门 Part 10:给路线回放添加高精度计时,理解累计延迟与路线一致性
后端
70后写java的老码农2 小时前
Spring Boot 3 + ShardingSphere-JDBC 实战:一次把读写分离和分库分表跑通
后端
泡海椒2 小时前
04-饼图评级构成-信用评级构成
后端
知守观2 小时前
多模块架构演进:横向分层 vs 纵向领域,13 个真实项目的切分对照
java·后端·微服务
系统集成-鹰翔3 小时前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
软件技术NINI4 小时前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
Tsuki_tl4 小时前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
后台模板学习4 小时前
Go Web开发中任务调度框架的源码解析与高可用实现方案
开发语言·后端·golang
系统集成-鹰翔4 小时前
ERP对接升级提示数据库迁移失败:SQLite逐版本事务到底回滚到哪一步
javascript·数据库·经验分享·后端
IT_陈寒4 小时前
深入理解SpringBoot:核心原理与最佳实践
前端·人工智能·后端