吐司问卷(React低代码):用户登陆模块实现

使用EggJS开发接口(三)登录验证之egg-jwt 及 crypto加密 egg-jwt是一个生成token的插件 token的规则: 服务器返回的token数据基本结构是Header.Payload.Signature,header、payload、signature三部分以'.'隔开。 例如: 1 2 3 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJ1c2VyTmFtZSI6ImNlc2hpemhhbmdodTAyIiwiaWF0IjoxNTU1MjEyMzg1LCJle... 阅读详情

吐司问卷:用户登陆

Date: February 17, 2025 4:12 PM (GMT+8)


JWT

**概念:**登陆成功后,服务端返回一个 token

JWT组成:

JWT 由三个部分组成:头部(Header)、载荷(Payload) 和 签名(Signature)。它们通过点(.)连接,格式如下:

header.payload.signature

示例:

假设用户登录成功,后端生成了一个 JWT,格式如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

这个 JWT 分为三部分:

  1. 头部(Header):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
  2. 载荷(Payload):eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
  3. 签名(Signature):SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT 工作流程通常如下:

  1. 用户登录: 用户提供用户名和密码,后端验证身份。
  2. 生成 JWT: 登录成功后,后端生成 JWT,包含用户身份信息,并通过密钥签名,确保其不可篡改。
  3. 返回 JWT: 后端将 JWT 发送给客户端,客户端通常将 JWT 存储在浏览器的 LocalStorage 或 Cookie 中。
  4. 客户端请求: 客户端在后续请求中将 JWT 作为 Authorization 头传递给后端(通常是 Authorization: Bearer <token>)。
  5. 服务器验证 JWT: 服务器根据 JWT 中的签名和密钥验证 JWT 的合法性,如果合法,则执行相应的操作,否则返回错误信息。

项目的 JWT 的认证流程:

image.png

关键代码实现:

登录时存储token

Login.tsx

// 登录成功后处理
onSuccess(res) {
  const { token = '' } = res
  setToken(token) // 存储到localStorage
  nav(MANAGE_INDEX_PATHNAME)
}

HTTP请求自动携带token

services/ajax.ts

// 请求拦截器
instance.interceptors.request.use(config => {
  const token = getToken()
  if (token) {
    config.headers.Authorization = `Bearer ${token}` // 自动携带token
  }
  return config
})

路由守卫验证

useNavPage.ts

useEffect(() => {
  if (username || token) { // 同时验证Redux状态和本地token
    if (isLoginOrRegister(pathname)) {
      nav(MANAGE_INDEX_PATHNAME)
    }
    return
  }
  // ...未登录处理
}, [waitingUserData, username, pathname])

自动用户认证

useLoadUserData.ts

// 自动加载用户信息
useEffect(() => {
  run() // 使用存储的token获取用户信息
}, [])

退出登录处理 (UserInfo.tsx)

const logout = () => {
  removeToken() // 清除token
  dispatch(logoutReducer()) // 清除Redux状态
  nav(LOGIN_PATHNAME)
}



登陆注册流程

注册流程:

注册流程:

  • 用户填写表单
  • Register组件调用 registerService,请求后端接口
  • 后端返回数据,显示登陆成功
  • 用户跳转至登陆页面

image.png

用户界面Register组件注册服务后端API填写注册表单调用registerService(username, password, nickname)POST /api/user/register返回注册结果注册成功跳转至登录页(LOGIN_PATHNAME)用户界面Register组件注册服务后端API

登录流程:

  • 用户填写表单
  • Login组件调用 LoginService,请求后端接口
  • 后端返回 token 和 用户信息
  • 前端 Redux 更新用户信息,如果用户勾选记住密码的话,还需要本地存储信息
  • 用户跳转问卷列表页

image.png

用户界面Login组件登录服务后端APIRedux本地存储localStorage填写登录表单调用loginService(username, password)POST /api/user/login返回token和用户信息dispatch(loginReducer)setToken(token)保存用户名密码清除保存的凭证alt[记住密码]跳转至问卷列表页(MANAGE_INDEX_PATHNAME)用户界面Login组件登录服务后端APIRedux本地存储localStorage



信息认证流程

认证流程

认证流程:

  • 路由系统加载用户信息
  • 路由守卫根据白名单进行鉴权,跳转对应页面

image.png

路由系统useNavPage HookuseLoadUserData Hook用户服务后端APIRedux加载用户数据调用getUserInfoService()GET /api/user/info返回用户信息更新用户状态返回加载状态执行路由守卫访问登录页则跳转管理页需要登录的页面跳转登录页alt[已登录状态][未登录状态]路由系统useNavPage HookuseLoadUserData Hook用户服务后端APIRedux


状态管理流程

状态管理流程:

  1. 基于JWT的token认证机制
  2. 自动登录状态保持
  3. 路由级别的权限控制
  4. 用户凭证的安全存储(localStorage)
  5. 全局状态管理(Redux + 自定义Hooks)

image.png

是
否
登录成功
存储token到localStorage
存储用户信息到Redux
路由跳转至管理页
页面刷新
自动加载用户信息
Redux中有数据?
维持当前路由
发起用户信息请求
更新Redux状态


路由守卫

路由守卫管理流程:

  1. 路由分层:
  • 将路由分为「无需鉴权」(登录/注册/首页)和「需要登录」两类
  • 通过isNoNeedUserInfo工具函数维护白名单路径
  1. 权限判断:
// 检查路径是否在免登录白名单
if (需要用户信息 && 未登录) {
  重定向到登录页
} else if (已登录 && 访问登录/注册页) {
  重定向到问卷管理页
}
  1. 状态管理:
  • 使用Redux全局存储用户信息
  • 本地存储持久化token(通过setToken/removeToken)
  • 登录后自动获取用户信息并更新Redux状态
  1. 跳转逻辑:
  • 登录成功 → 管理首页
  • 退出登录 → 登录页
  • 未登录访问受保护路由 → 登录页(保留原路径便于登录后跳回)

实现要点:

  1. 通过布局组件实现路由守卫(MainLayout包裹需要鉴权的路由)
  2. 路由路径常量统一管理(避免硬编码)
  3. 支持登录后跳转回原访问页(通过路由状态保持)
  4. Token验证通过axios拦截器自动处理

用户访问鉴权流程图:

image.png



实现要点总结

1-凭证存储:

user-token.ts

// 使用localStorage存储token
export const setToken = (token: string) => {
    localStorage.setItem(USER_TOKEN_KEY, token)
}

2-路由守卫逻辑:

useNavPage.ts

// 路由导航控制核心逻辑
useEffect(() => {
  if (username || token) {    // 已登录状态
    if (isLoginOrRegister(pathname)) {
      nav(MANAGE_INDEX_PATHNAME)  // 禁止访问登录/注册页
    }
  } else {                     // 未登录状态
    if (!isNoNeedUserInfo(pathname)) {
      nav(LOGIN_PATHNAME)      // 重定向到登录页
    }
  }
}, [waitingUserData, username, pathname])

3-自动登录机制:

useLoadUserData.ts

// 组件挂载时自动加载用户信息
useEffect(() => {
  if (!username) {  // 仅当Redux无用户信息时执行
    run()
  }
}, [])



开发用户的 mock 和 service

思路:

  • 封装 axios 请求拦截器:增加用户token
  • 设计 用户注册登陆接口
  • 设计 工具函数 user-token:用于管理用户 token
  • 设计 问卷页面 的当前用户显示与退出功能

封装 axios 请求拦截器:增加用户token

ajax.ts

import axios from 'axios'
import { message } from 'antd'
import { getToken } from '../utils/user-token'

const instance = axios.create({
  timeout: 10000,
})

instance.interceptors.request.use(
  config => {
    const token = getToken()
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

instance.interceptors.response.use(res => {
  const resData = (res.data || {}) as ResType
  console.log('resData', resData)
  const { errno, data, msg } = resData
  if (errno !== 0) {
    if (msg) {
      message.error(msg)
    }
    throw new Error(msg || '未知错误')
  }
  return data as any
})

export default instance

export type ResType = {
  errno: number
  data?: ResDataType
  msg?: string
}

// key表示字段名,any表示字段值的类型
export type ResDataType = {
  [key: string]: any
}

设计 用户注册登陆接口:

user.ts

import axios, { ResDataType } from './ajax'

// 获取用户信息
export async function getUserInfoService(): Promise<ResDataType> {
  const url = '/api/user/info'
  const data = (await axios.get(url)) as ResDataType
  return data
}

// 注册用户
export async function registerService(
  username: string,
  password: string,
  nickname?: string
): Promise<ResDataType> {
  const url = '/api/user/register'
  const body = {
    username,
    password,
    nickname: nickname || username,
  }
  const data = (await axios.post(url, body)) as ResDataType
  return data
}

// 登陆用户
export async function loginService(
  username: string,
  password: string
): Promise<ResDataType> {
  // Updated return type
  const url = '/api/user/login'
  const body = {
    username,
    password,
  }
  const data = (await axios.post(url, body)) as ResDataType
  return data
}

设计工具函数 user-token:用于管理用户 token:

user-token.ts

/**
 * @description 管理用户token
 */

const KEY = 'USER_TOKEN'

export function setToken(token: string) {
  localStorage.setItem(KEY, token)
}

export function getToken() {
  return localStorage.getItem(KEY) || ''
}
export function removeToken() {
  localStorage.removeItem(KEY)
}

设计 问卷页面 的当前用户显示与退出功能:

userInfo.tsx

image.png

import React, { FC } from 'react'
import { Link, useNavigate } from 'react-router-dom'
import { LOGIN_PATHNAME } from '../router'
import { Button, message } from 'antd'
import { UserOutlined } from '@ant-design/icons'
import { getUserInfoService } from '../services/user'
import { removeToken } from '../utils/user-token'
import { useRequest } from 'ahooks'

const UserInfo: FC = () => {
  const nav = useNavigate()
  const { data } = useRequest(getUserInfoService)
  const { username, nickname } = data || {}
  const logout = () => {
    removeToken()
    message.success('退出成功')
    nav(LOGIN_PATHNAME)
  }
  const UserInfo = () => {
    return (
      <>
        <span style={{ color: '#e8e8e8' }}>
          <UserOutlined />
          {nickname || username}
        </span>
        <Button type="link" onClick={logout}>
          退出
        </Button>
      </>
    )
  }
  const Login = () => {
    return (
      <>
        <Link to={LOGIN_PATHNAME}>登陆</Link>
      </>
    )
  }
  return <div>{username ? <UserInfo /> : <Login />}</div>
}

export default UserInfo




fix: 成功登录再次闪回

问题:

2025-03-07 10.39.19.gif

原因分析:

分析思路:

1-登录流程:

  • 用户登录成功后,setToken(token) 将 token 保存到 localStorage
  • 然后导航到问卷列表页面 nav(MANAGE_INDEX_PATHNAME)

2-路由守卫检查:

  • 在 useNavPage.ts 中:
if (username) {
  // 允许访问
} else {
  nav(LOGIN_PATHNAME) // 重定向到登录页
}

这里只检查了 username,没有检查 token

关键问题:

  • 登录时只保存了 token,没有同时保存/更新用户名
  • 当导航到问卷列表页面时,useNavPage 钩子发现没有 username,就立即重定向回登录页

解决方案:

1-修改 useNavPage.ts 检查逻辑

import { useEffect } from 'react'
import { useNavigate, useLocation } from 'react-router-dom'
import {
  isLoginOrRegister,
  isNoNeedUserInfo,
  MANAGE_INDEX_PATHNAME,
  LOGIN_PATHNAME,
} from '../router'
import useGetUserInfo from './useGetUserInfo'
import { getToken } from '../utils/user-token' // 导入获取token函数

function useNavPage(waitingUserData: boolean) {
  const { username } = useGetUserInfo()
  const { pathname } = useLocation()
  const nav = useNavigate()
  
  // 获取token状态
  const token = getToken()

  useEffect(() => {
    if (waitingUserData) return
    
    // 同时检查username和token
    if (username || token) {
      if (isLoginOrRegister(pathname)) {
        nav(MANAGE_INDEX_PATHNAME)
      }
      return
    }
    
    if (isNoNeedUserInfo(pathname)) {
      return
    } else {
      nav(LOGIN_PATHNAME)
    }
  }, [waitingUserData, username, pathname])
}

export default useNavPage

2-修改登录成功回调,手动更新Redux状态

Login.tsx

import { useDispatch } from 'react-redux'
import { loginReducer } from '../store/userReducer' // 确保路径正确

const Login: FC = () => {
  // ...已有代码...
  const dispatch = useDispatch()
  
  const { run } = useRequest(
    async (username: string, password: string) => {
      const data = await loginService(username, password)
      return data
    },
    {
      manual: true,
      onSuccess(res) {
        const { token = '', username } = res
        
        // 1. 保存token
        setToken(token)
        
        // 2. 立即更新Redux中的用户信息
        dispatch(loginReducer({ username }))
        
        // 3. 短暂延迟确保状态更新后再导航
        setTimeout(() => {
          message.success('登录成功')
          nav(MANAGE_INDEX_PATHNAME)
        }, 100)
      },
    }
  )
  // ...其余代码不变...
}
基于React技术栈的问卷星仿制项目设计源码 问卷星仿制项目:基于React技术栈开发,包含27个文件,包括5个JSON配置文件、3个JavaScript文件、3个TSX文件、3个TypeScript文件、2个PNG图像文件、2个CSS样式文件、1个.gitignore文件、1个husky/commit-msg文件、1个husky/pre-commit文件和1个Markdown文档。该项目是一个复杂低代码项目,采用最新React技术栈,旨在仿制问卷星平台,为用户提供一个类似的问卷调查解决方案。 立即下载

相关推荐

ADS入门学习笔记——射频振荡器的设计

振荡器是射频系统中的基本部件之一,可以将直流功率转换为射频功率,在特定的频率点建立起稳定的正弦振荡,成为所需的射频信号源。

weixin_42126696的博客 8949

jwt 私钥_基于JWT的token弱密钥爆破

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。直接根据token取出保存的用户信息,以及对token可用性校验,大大简化单点登录。JWT=header+payload+signature(以.相隔)例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NzYxMTk2NTYsInVzZXJuYW1lIjoiemRqIiwi...

weixin_39629679的博客 8078

MatLab:数字图像处理实验

图像处理基本处理实验目的实验环境实验内容题目一代码结果题目二平移平移代码平移结果水平镜像水平镜像代码水平镜像结果垂直镜像垂直镜像代码垂直镜像结果放大放大代码放大结果缩小缩小代码缩小结果旋转旋转代码旋转结果双线性旋转旋转代码旋转结果 实验目的 1、熟悉并掌握MATLAB工具的使用;  2、实现图像的读取、显示、存储、平移、镜像、放大、缩小及旋转操作; 3、掌握常用的插值方法,并了解其优缺点。 实验环境 MatLab2016 实验内容 题目一 读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显

luoyao_的博客 9696

启动器修改

123123

juoiu45的博客 2537

OSG三维渲染引擎编程学习之一:“第一章:OSG介绍” 之 “1.1 OSG简介”

第一章:OSG介绍; 1.1 OSG简介。

LuckyHanMo的博客 3223

Dify框架面试内容整理-如何优化Dify的应用性能?

为1536维)可选用 PCA、FAISS 的量化压缩方法降低维度(如128、256、512);对知识库预览、任务流配置等页面,使用 nginx/cache-control 减少请求。API 响应耗时(P50/P95)、Token 使用量、缓存命中率、向量检索耗时;对 Prompt+输入内容计算 Hash,缓存相同请求的返回结果;使用占位符 + 函数拼接,按需组合 Prompt,而非静态长模板;数据量大时,应在构建索引前清洗冗余段落、统一格式,避免重复向量。维度越低,检索越快,但可能影响召回准确度,需平衡。

不务正业的猿 1549

JWT原理详解

JWT原理详解 随着前后端分离的发展,以及数据中心的建立,越来越多的公司会创建一个中心服务器,服务于各种产品线。 而这些产品线上的产品,它们可能有着各种终端设备,包括但不仅限于浏览器、桌面应用、移动端应用、平板应用、甚至智能家居 实际上,不同的产品线通常有自己的服务器,产品内部的数据一般和自己的服务器交互。 但中心服务器仍然有必要存在,因为同一家公司的产品总是会存在共享的数据,比如用户数据 这些设备与中心服务器之间会进行http通信 一般来说,中心服务器至少承担着认证和授权的功能,例如登录:各种设备发

前端那些事@时光 3591

Java SSH框架学习

Java SSH框架学习

私信可回答各种问题~ 1789

React低代码项目:Redux 状态管理

React低代码项目:Redux 状态管理

CaptainDrake的博客 1304

学习笔记:TF卡启动荔枝派Nano(全志F1C200S)

荔枝派Nano编译Kernel报错报错内容如下编译烧录 报错内容如下 No controllers found No ethernet found. 从这些报错我真没看从出啥问题,也是在网上找,说是没有找到flash,是因为淘宝买的板子更换了flash,需要在u-boot里面重新适配型号: 板子的型号为xt25f128,但是实际u-boot的配置里面不是需要重新更改: u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts &spi0 { pin

热爱科技,物联,程序开发等 2133

SAP Fiori 会话超时全解析:从 Launchpad 到 Identity Authentication 的统一策略

SAP Fiori会话超时机制解析与配置策略 本文深入探讨SAP Fiori项目中的会话超时机制,分析其对系统安全和用户体验的双重影响。文章系统拆解了SAP Fiori Launchpad与SAP Cloud Identity Services之间的会话超时工作原理,重点介绍了两种超时机制:服务器驱动的超时(通过SESSION_TIMEOUT_STOP_DATA_REFRESH参数控制)和UI驱动的超时(通过SESSION_TIMEOUT_INTERVAL_IN_MINUTES参数控制)。文中结合制造业产线

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 213

Tus系统:项目总结

这是一个全栈低代码项目,主要业务是问卷调查与统计,分成B端和C端: B端用于管理、编辑、统计问卷,C端用于用户填写问卷。 项目的技术栈有: 前端:React + Next 后端:Nest + MongoDB 测试:Jest + Storybook

CaptainDrake的博客 1045

PyTorch实战(13)——图卷积网络(Graph Convolutional Network,GCN)

图卷积网络 (Graph Convolutional Network, GCN) 模型能够同时结合节点级特征和图级(邻域)信息进行分类,显著提升了图数据建模能力,适用于节点分类、图分类等多种任务。本节中,我们通过 PyTorch Geometric 库在 CiteSeer 图数据集上构建模型,们首先用前馈神经网络作为基线模型完成节点分类任务,随后用 GCN 模型替代前馈网络显著提升了分类准确率。

盼小辉丶的博客 3253

项目实践 | JWT解析与实战编码(简单版)

JWT是一种用于身份验证的令牌机制,由头部(Header)、负载(Payload)和签名(Signature)三部分组成。头部包含算法和类型信息,负载存储用户数据和标准声明,签名通过密钥加密生成,确保令牌完整性。服务端通过密钥验证JWT有效性,防止篡改。典型流程包括:登录生成JWT、请求携带JWT、拦截器验证JWT(检查存在性、有效性和过期情况)。密钥仅保存在服务端,确保安全性。JWT通过签名算法和密钥保护数据,类似HTTPS的完整性保护机制。

2503_90542405的博客 1133

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Golang 实现JWT认证

Golang 实现JWT认证 认证是让应用知道给应用发送请求的人是他所说的那个人。JSON web token (JWT)是认证的一种方式,相比于基于Session认证,在系统中并不存储任何关于用户信息。 本文演示使用Golang实现基于JWT认证的示例应用。 1. JWT 1.1. JWT格式 假设用户user1尝试登录应用,成功后收到token信息如下: eyJhbGciOiJIUzI1NiI...

neweastsun的专栏 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

react-问卷星项目(1)

记录react项目的学习和创建

BHDDGT的博客 2858

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

react-问卷星项目(3)

抽离出来的这个组件定义为ts组件即可// ts文件即可,因为没有JSX片段,即div等标签}, []);监听鼠标事件// 获取鼠标位置// "这个组件",即谁引用就指向谁// 监听鼠标事件// 组件销毁时一定要解绑DOM事件,不然可能会出现内存泄漏问题// 解绑的时候需要和绑定的时候的函数相同}, []);模拟异步加载数据// 模拟异步信息}, 1500);});});}, []);

BHDDGT的博客 1576

使用React和Ant Design实现登录页面

使用React和Ant Design创建一个登录页面是一个很好的实践,可以让你的界面既美观又功能齐全。

momi的专栏 2504

吐司问卷(React低代码):问卷编辑器 II

工具栏设计、组件库设计

CaptainDrake的博客 1335

服务器如何验证jwt,使用JWT实现前后端权限验证

本帖最后由 菜肉果蔬 于 2018-11-26 16:23 编辑一、JWT简介JWT是json web token缩写。是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。JWT的原则是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,如下所示,登录时发送如下信息:...

weixin_33007509的博客 8466

基于Token的身份验证的过程

基于Token的身份验证的过程如下:客户端使用用户名跟密码请求登录服务端收到请求,去验证用户名与密码验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里客户端每次向服务端请求资源的时候需要带着服务端签发的 Token服务端收到请求,然后去验证客户端请求里面带着的 To...

喵酱 1万+

JWT的使用

目标: ①、jwt出现的原因及工作原理 ②、jwt工具类介绍,三种场景 ③、jwt与vuex配合在SPA项目中的应用 一、jwt的介绍 1、jwt是什么 JSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案 2、为什么使用JWT JWT的精髓在于:“去中心化”,数据是保存在客户端的。 3、JWT的工作原理 是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,示例如下: {"UserName": "Chongchong","Role": "Ad

m0_60385807的博客 6545

JWT

1. JWT是什么 JSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案 2. 为什么使用JWT JWT的精髓在于:“去中心化”,数据是保存在客户端的。 3. JWT的工作原理 是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户,示例如下: {“UserName”: “Chongchong”,“Role”: “Admin”,“Expire”: “20...

P_YUX的博客 769

php jwt解密token,php实现JWT(json web token)鉴权实例详解

{"alg": "HS256","typ": "JWT"}对应base64UrlEncode编码为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9说明:该字段为json格式。alg字段指定了生成signature的算法,默认值为 HS256,typ默认值为JWTpayload部分:{"sub": "1234567890","name": "John Doe","iat":...

weixin_36378232的博客 1877

openssl 计算sha256

echo -n eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJwYnh3ZWIiLCJleHAiOjE1OTg5NTc2NTEsImlhdCI6MTU5ODk1NzY0MSwiaXNzIjoicGJ4 | openssl sha -sha256 -binary -hmac key12345678 | base64

lyyslsw的专栏 6919
上一篇: 吐司问卷(React低代码):问卷编辑器 II
下一篇: 吐司问卷:性能优化
CaptainDrake
博客等级 码龄6年 5363粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值