当前位置: 首页 > news >正文

accessToken

1、介绍

accessToken,通常是用于身份验证和授权的令牌,它可以用于前端和后端,具体使用方式取决于应用程序的架构和需求。

  1. 前端应用
    accessToken通常用于向后端API发送请求时进行身份验证和授权。
    (1)前端应用程序会在用户登录成功后获取accessToken;
    (2)并将accessToken存储在本地;
    (3)然后在每次请求API时,将accessToken作为请求头或参数发送给后端;
    (4)后端会验证accessToken的有效性,并根据权限决定是否允许请求。
  2. 后端应用
    accessToken通常用于验证客户端的身份和权限
    (1)后端应用程序会接收到前端发送的accessToken;
    (2)对accesToken进行验证;
    (3)验证方式:
    1)通过访问授权服务器进行验证;
    2)通过解析和验证accessToken的签名来确保其有效性。

2、后端生成accessToken

2.1 生成accessToken基本思想

accessToken通常是由后端生成的
在前后端分离的架构中,前端通过向后端发送用户名和密码等凭证(安全的身份验证机制)进行身份验证,后端验证成功后会生成一个唯一的accessToken(其通常是一个加密的字符串,用于标识用户的身份和权限),并将其存储在后端服务器数据库中或(作为一个临时的令牌)返回给前端,前端将其保存到本地。

前端在后续的请求中携带这个accessToken,后端通过验证accessToken的有效性来确认用户的身份和权限;

2.2 生成accessToken基本步骤

后端生成accessToken的过程通常是为了实现用户认证和授权功能,生成accessToken常见的方式:
(1)用户登录:用户在前端提供用户名和密码进行登录;
(2)后端验证:后端接收到用户的登录请求后,会验证用户提供的用户名和密码是否正确;
(3)生成accessToken:如果验证(用户名和密码等均正确)通过,后端会生成一个唯一的accessToken,并将其与用户信息关联起来,accessToken可以是一个随机字符串或使用加密算法生成的token;
(4)返回accessToken:后端将生成的accessToken返回给前端,前端可以将其保存在本地,以便后续的请求中使用;
(5)鉴权:前端在后续的请求中携带accessToken,后端会对accessToken进行验证,以确定请求是否来自己经登录过的用户。

2.3 后端生成accessToken具体实现

3、后端返回给前端accessToken

4、后端验证accessToken

后端生成accessToken
后端返回给前端accessToken
后端验证accessToken

5、注意点

(1)accessToken的有效性:accessToken通常具有一定的有效期限制,以确保安全性,一旦accessToken过期,客户端需要重新进行身份验证,并获取新的accessToken;
(2)确保accessToken安全性:可使用加密算法(HMAC-SHA256)将用户身份信息和必要信息(过期时间和权限)与一个密钥进行加密;

问题:

  1. 什么是过期时间,权限?
  2. 如何使用用户登录信息+过期时间+权限,生成accessToken?
  3. 生成的accessToken保存到哪里(前端和后端都要保存吗)?
    redis中
  4. 保存到数据库,如何保存,保存后,用户再次发起请求如何验证?
    返回给前端、后端保留到redis,从redis中获取并进行验证
  5. 如何验证过期时间
  6. 前端传过来的accessToken是什么样的?

6、实现生成token并保存到redis具体代码

6.1 依赖

 <!-- redis 缓存操作:提供了一些自动配置和默认的Redis连接工厂 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--        JWT依赖--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>

6.2 生成token的工具类

package com.XXXX.util;import com.alibaba.fastjson.JSONObject;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;/*** 生成accessToken(用户id+登录用户名+角色)*/
public class TokenUtil {private static final String ALGORITHM = "HmacSHA256";private static final String SECRET_KEY = "cccccc";public static String generateAccessToken(Integer id,String username, String roleName) {try {// 创建一个随机的密钥byte[] secretKeyBytes = SECRET_KEY.getBytes(StandardCharsets.UTF_8);SecretKeySpec secretKeySpec = new SecretKeySpec(secretKeyBytes, ALGORITHM);// 创建JSON对象JSONObject json = new JSONObject();json.put("id",id);json.put("username", username);json.put("role", roleName);// 将JSON对象转换为字符串String jsonString = json.toString();// 使用密钥对字符串进行加密Mac hmacSha256 = Mac.getInstance(ALGORITHM);hmacSha256.init(secretKeySpec);byte[] encryptedBytes = hmacSha256.doFinal(jsonString.getBytes(StandardCharsets.UTF_8));// 将加密后的字节数组进行Base64编码String accessToken = Base64.getEncoder().encodeToString(encryptedBytes);return accessToken;} catch (Exception  e) {e.printStackTrace();}return null;}
}

6.3 redis相关工具

package com.XXXX.util.redis;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());return redisTemplate;}
}

6.4 生成token并保存到redis

/*** 生成token并保存到redis中** @param manager* @return*/@PostMapping("/access")@ResponseBodypublic R accessToken(@RequestBody Manager manager) {String id = String.valueOf(manager.getId());long expireTimeInSeconds = 10;  //设置时效(秒为单位)
//        1.生成accessTokenString s = TokenUtil.generateAccessToken(manager.getId(), manager.getUsername(), manager.getRoleName());
//        2.存入accessTokenredisTemplate.opsForValue().set(id, s, expireTimeInSeconds, TimeUnit.SECONDS);Object o = redisTemplate.opsForValue().get(id);System.out.println("redis:" + o);logger.info(s.toString());System.out.println("token:" + s);return R.ok("成功");}/*** 验证redis中的数据的时效性** @param manager* @return*/@PostMapping("/redisTime")@ResponseBodypublic R timeToken(@RequestBody Manager manager) {String id = String.valueOf(manager.getId());Object o = redisTemplate.opsForValue().get(id);System.out.println("验证时效:" + o);return R.ok(o);}

相关文章:

accessToken

1、介绍 accessToken&#xff0c;通常是用于身份验证和授权的令牌,它可以用于前端和后端&#xff0c;具体使用方式取决于应用程序的架构和需求。 前端应用 accessToken通常用于向后端API发送请求时进行身份验证和授权。 &#xff08;1&#xff09;前端应用程序会在用户登录成…...

nodeJs 学习

常用快捷键 二、fs模块 回调函数为空&#xff0c;则表示写入成功&#xff01; 练习 const fs require(fs); fs.readFile(../files/成绩.txt, utf-8, (err, dataStr) > {if (err) {console.log(读取失败);return err;}console.log(读取成功);const arr dataStr.split( )co…...

STM32利用AES加密数据、解密数据

STM32利用AES加密数据、解密数据 MD5在线工具Chapter1 STM32利用AES加密数据、解密数据一、头文件二、源文件三、使用 Chapter2 stm32 的 md5计算函数Chapter3 STM32 应用程序加密的一种设计方案前言一、计算AppKey二、自动配置流程三、出厂固件合并 个人总结 MD5在线工具 htt…...

C语言技能数(知识点汇总)

C语言技能数&#xff08;知识点汇总&#xff09; C 语言概述特点不足之处 标准编程机制 数据类型变量数据类型字符类型整数类型符号位二进制的原码、反码和补码 浮点类型布尔类型 常量字面常量const 修饰的常变量#define定义的标识符常量枚举常量 sizeofsizeof(结构体)不要对 v…...

Vue.js+SpringBoot开发企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…...

Linux Shell中的echo命令详解

Linux Shell中的echo命令详解 在Linux Shell中&#xff0c;echo命令是一个常用的内置命令&#xff0c;用于在终端上显示文本或字符串。它主要用于显示变量的值&#xff0c;创建文件的内容&#xff0c;或者简单地输出一些信息。在本文中&#xff0c;我们将详细探讨echo命令的用…...

php 页面中下载文件|图片

一、需求 页面中点击下载图片 二、实现 protected function pageLoad(){$filePath $_GET[file];$host $_SERVER[HTTP_HOST];$file http://.$host.$filePath;$fileName basename($filePath);$content file_get_contents($file);ob_clean();$suffixArr explode(., $file…...

2024年企业经济管理与大数据国际会议(ICEEMBD 2024)

2024年企业经济管理与大数据国际会议&#xff08;ICEEMBD 2024&#xff09; 2024 International Conference on Enterprise Economic Management and Big Data 会议简介&#xff1a; 大数据分析在经济管理中发挥着至关重要的作用&#xff0c;它不仅能够提高决策效率和准确性…...

数新网络助阵哈工大国家级项目,共绘数智化新篇章,打造大数据法务平台

2024年1月23日,由哈尔滨工业大学牵头的国家重点研发计划“基于多元关联分析的大数据法律监督关键技术研究”项目2023年度项目进展报告会在杭州成功举办。 本次会议通过线上线下同步开展的形式进行,旨在对项目的进展情况进行深入总结探讨及成果展示,确保项目的研发方向与实际法律…...

React+umi+dva 项⽬实战-lesson6

lesson4-react全家桶及原理解析.mov 项⽬实战 项⽬实战 课堂⽬标资源知识要点起步Generatorredux-sagaumi why umidvadva+umi 的约定安装Umi基本使⽤理解dva移动端cra项⽬简介课堂⽬标 掌握企业级应⽤框架 - umi掌握数据流⽅案 - dva掌握⽣成器函数 - generator掌握redux异步⽅…...

Vue el-table 合并单元格

一般常见的就是下图这种的单列&#xff0c;上下重复进行合并。 有时候可能也会需要多行多列的合并。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&qu…...

面试算法-61-二叉树的右视图

题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 解 class Solution {public List<Integer> rightSideView(T…...

【鸿蒙HarmonyOS开发笔记】动画过渡效果之布局更新动画

概述 动画的原理是在一个时间段内&#xff0c;多次改变UI外观&#xff0c;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧&#xff0c;对应一次屏幕刷新&#xff0c;而决定动画流畅度的一个重要指标就是帧率FPS&#x…...

过路费的题解

目录 原题描述&#xff1a; 题目描述 输入格式&#xff1a; 输出格式&#xff1a; 样例输入&#xff1a; 样例输出&#xff1a; 数据范围&#xff1a; 提示&#xff1a; 主要思路&#xff1a; code: 原题描述&#xff1a; 题目描述 在某个遥远的国家里&#xff0c;有…...

51单片机LED8*8点阵显示坤坤跳舞打篮球画面

我们作为一名合格的 ikun&#xff0c;专业的小黑子&#xff0c;这个重要的知识必须学会。 先看效果&#xff1a; 51LED点阵_鸡你太美 这里我们首先要用到延时函数Delay&#xff1a; void Delay(unsigned int xms) {unsigned char i, j;while(xms--){ i 2;j 239;do{while (-…...

C++_day6:2024/3/18

作业1&#xff1a;编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在…...

汇编语言和IBM的关系

一 缺乏汇编的硬件没有灵魂 1964年&#xff0c;在IBM没有发明System 360大型计算机之前&#xff0c;IBM已经发明了很多计算机。如IBM 1952年发布的第一台商用计算机&#xff1a;701计算机。1959年&#xff0c;IBM首次利用晶体管、磁芯存储器、印刷电路技术&#xff0c;发明了小…...

堆(数据结构)

堆的概念及结构 如果有一个关键码的集合K { &#xff0c; &#xff0c; &#xff0c;…&#xff0c; }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中&#xff0c;并满足&#xff1a; < 且 < ( > 且 > ) i 0&#xff0c;1&#xff…...

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型

医药工厂5G智能制造数字孪生可视化平台&#xff0c;推进医药企业数字化转型。随着科技的不断发展&#xff0c;数字化转型已成为医药企业不可或缺的一部分。5G智能制造医药工厂数字孪生可视化平台作为数字化转型的重要工具&#xff0c;正在逐步改变医药企业的生产方式和管理模式…...

C语言学习--八种排序算法

目录 排序的概念 1.直接插入排序 基本思想 代码实现 算法分析 2.希尔排序 基本思想 代码实现 算法分析 3.冒泡排序 基本思想 代码实现 算法分析 4.快速排序 基本思想 代码实现 算法分析 5.简单选择排序 基本思想 代码实现 算法分析 6.堆排序 基本思想 代…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...