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);}

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

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

相关文章

boost的ptree比qt的接口更适合读写xml,因为它舍弃了结点属性,里面只有根节点和子节点,显得更简洁

就6个接口&#xff1a; 写xml文件 boost::property_tree::ptree 动物园; add<std::string>("名字", "苹果"); add_chile("水果类型",水果);// 读取 XML 文件 boost::property_tree::read_xml("example.xml", pt); get_child()&…

描述我处理过的一个性能优化问题如何实现Web应用的负载均衡?

一、描述我处理过的一个性能优化问题 在我过去的工作经历中&#xff0c;我遇到并成功解决了一个性能优化问题。这个问题发生在一个电商网站的后台管理系统中&#xff0c;当管理员尝试查询大量订单数据时&#xff0c;系统的响应速度非常慢&#xff0c;有时甚至导致页面超时或崩…

SpringCloud入门(1) Eureka Ribbon Nacos

这里写目录标题 认识微服务SpringCloud 服务拆分和远程调用服务拆分案例实现远程调用 RestTemplate Eureka注册中心Eureka的结构和作用搭建eureka-server服务注册服务发现 Ribbon负载均衡 LoadBalancedLoadBalancerIntercepor源码解析负载均衡策略饥饿加载 Nacos注册中心安装与…

不同环境迁移和hive等不同数据源迁移数据到Doris的解决方案

1、Doris不同开发环境迁移 在项目开发时,需要开发环境、测试环境、uat环境、预生产环境、生产环境。常常遇到这样的场景:需要把某个环境的所有表结构和数据都迁移到某个环境。手动去操作是耗时耗力的,这时需要通过代码或工具来高效执行。 1.1 使用代码进行迁移表结构 /***…

PySpark案例实战

一、前言介绍 二、基础准备 # 导包 from pyspark import SparkConf,SparkContext #创建SparkConf类对象 confSparkConf().setMaster("local[*]").setAppName("test_spark_app") #基于SparkXConf类对象创建SparkContext对象 scSparkContext(confconf) #打印…

GC垃圾回收的算法

GC&#xff08;垃圾回收&#xff09;的算法有多种&#xff0c;每种都有其特点和适用场景。以下是一些常见的GC算法&#xff0c;并举例进行说明&#xff1a; 引用计数算法&#xff1a; 原理&#xff1a;为每个对象维护一个引用计数器&#xff0c;每当有一个地方引用这个对象时&a…

Arduino RP2040 多核心运行模式

Arduino RP2040 多核心运行模式 &#x1f4cc;RP2040基于Earle F. Philhower, III的开发核心固件&#xff1a;https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json&#x1f388;相关开发文档在线j简要介绍&#xff1a;https:/…

深入理解栈和队列(一):栈

个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《数据结构》 一、栈的概念 栈&#xff08;Stack&#xff09;是一种特殊的线性表&#xff0c;它遵循后进先出&#xff08;Last-In-First-Out&#xff0c;LIFO&#xff09;的原则。栈可以被看作是一个只能在一端进行操作…

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中&#xff0c;获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库&#xff0c;结合 XPath 解析网页信息&#xff0c;实现对链家网二手房销售数据的爬取&#xff0c;并将数据导出为 Excel 文件的过…

多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

springcloud修炼——Eureka注册中心

如果你要理解这个技术博客博客专栏 请先学习以下基本的知识&#xff1a; 什么是微服务什么是服务拆分什么是springcloud Springcloud为微服务开发提供了一个比较泛用和全面的解决框架&#xff0c;springcloud继承了spring一直以来的风格——不重复造轮子&#xff0c;里面很多的…

【NLP笔记】Transformer

文章目录 基本架构EmbeddingEncoderself-attentionMulti-Attention残差连接LayerNorm DecoderMask&Cross Attention线性层&softmax损失函数 论文链接&#xff1a; Attention Is All You Need 参考文章&#xff1a; 【NLP】《Attention Is All You Need》的阅读笔记 一…

WPF按钮相关

跟着官网敲的按钮相关的内容,还涉及了wpf很多其他的知识 1.创建基本按钮 <Grid><StackPanel HorizontalAlignment"Left"><Button>Button1</Button><Button>Button2</Button><Button>Button3</Button></StackPan…

如何在gitee上fork github上面的项目,并保持同步更新

前言 当看到github上面比较好的项目&#xff0c;想用到自己的项目&#xff0c;又不想仓库别人看&#xff0c;同时网络不好&#xff0c;囊中又羞涩的情况下&#xff0c;怎么办&#xff1f; 可以考虑用gitee来同步更新github上面的项目。 一、在gitee创建私有仓库 新建的是选择…

Windows电脑设置自动关机的教程

前言 说来也是搞笑&#xff1a;朋友跟我诉苦说&#xff0c;他有时候下班忘了关闭电脑&#xff0c;结果经常因为电脑不关机导致被领导扣工资。 说到扣工资这个问题&#xff0c;直接仲裁就好啦&#xff01;哈哈哈&#xff0c;突然又是一波泼天的富贵来临&#xff0c;这必须要接住…

计算方法——数据拟合

1、引入&#xff1a;单变量数据拟合 原先的插值要求给出的数据点要在拟合的函数上&#xff0c;但数据拟合&#xff0c;只需整体“近似”&#xff0c;不强求所有的数据点一致 假设给出数据&#xff1a; 那么 偏差 的定义为&#xff1a; 但是偏差“大小”&#xff0c;最好是用绝…

计算机网络:数据交换方式

计算机网络&#xff1a;数据交换方式 电路交换分组交换报文交换传输对比 本博客介绍计算机之间数据交换的三种方式&#xff0c;分别是电路交换、分组交换以及报文交换。 电路交换 我们首先来看电路交换&#xff0c;在电话问世后不久&#xff0c;人们就发现要让所有的电话机都…

c++类和对象(中)类的6个默认成员函数及const成员函数

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;类和对象 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱们之前也是…

OpenAI的语言生成器GPT-3受到了广泛关注。

OpenAI的第三代语言生成器GPT-3备受关注 概述 OpenAI&#xff0c;一家由Peter Thiel、Elon Musk、Reid Hoffman、Marc Benioff和Sam Altman等知名人士支持的非营利人工智能研究公司&#xff0c;最近发布了其第三代语言预测模型GPT-3。GPT-3的发布受到了早期用户的高度关注。 …

【开发环境搭建篇】IDEA安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…