利用JWT生成Token

jwt生成token 1 基于传统的session认证 http本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还再一次进行用户认证。因为根据http协议,我们不知道是哪个用户发出的请求,所以为了能让我们应用识别是哪一个用户发出的请求,我们只能在服务器端存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器。告诉其保存为cookie,以便下次请求时发送给我们的应用,这样我们的用户就能识别是哪一个用户了,这就是传统的基于session认证。 当... 阅读详情

转自 https://www.jianshu.com/p/75208a68c3b9

实现Token的方式有很多,本篇介绍的是利用Json Web Token(JWT)生成的Token.JWT生成的Token有什么好处呢?

  • 安全性比较高,加上密匙加密而且支持多种算法。
  • 携带的信息是自定义的,而且可以做到验证token是否过期。
  • 验证信息可以由前端保存,后端不需要为保存token消耗内存。

本篇分3部分进行讲解。

    1. 什么是JWT
    1. JWT的代码实现,代码将JWT封装成两个工具类,可以直接调用。
    1. 总结

如果原理很难懂,没关系。可以直接看JWT的代码实现。代码已经上传github。已经对代码进行封装成工具类。可以直接使用。

什么是JWT

JSON Web Token 简称JWT。
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
JWT生成的token是这样的

eyJpc3MiOiJKb2huI.eyJpc3MiOiJ.Kb2huIFd1IEp

生成的token,是3段,用.连接。下面有解释。

头部

用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
例如:

{
   "typ": "JWT",
  "alg": "HS256"
}

载荷

其实就是自定义的数据,一般存储用户Id,过期时间等信息。也就是JWT的核心所在,因为这些数据就是使后端知道此token是哪个用户已经登录的凭证。而且这些数据是存在token里面的,由前端携带,所以后端几乎不需要保存任何数据。
例如:

{
  "uid": "xxxxidid",  //用户id
  "exp": "12121212"  //过期时间
}

签名

签名其实就是:
1.头部和载荷各自base64加密后用.连接起来,然后就形成了xxx.xx的前两段token。
2.最后一段token的形成是,前两段加入一个密匙用HS256算法或者其他算法加密形成。

  1. 所以token3段的形成就是在签名处形成的。

JWT的原理参考文章

代码实现

1.看代码前一定要知道JWT是由头部、载荷与签名组成。
2.代码已上传github,希望点个赞

  1. 代码将JWT封装成两个工具类,可以直接调用。

需要下载的jar包

<dependency>
            <groupId>com.nimbusds</groupId>
            <artifactId>nimbus-jose-jwt</artifactId>
            <version>4.23</version>
</dependency>

生成token

 /**
     * 1.创建一个32-byte的密匙
     */

    private static final byte[] secret = "geiwodiangasfdjsikolkjikolkijswe".getBytes();


    //生成一个token
    public static String creatToken(Map<String,Object> payloadMap) throws JOSEException {

        //3.先建立一个头部Header
        /**
         * JWSHeader参数:1.加密算法法则,2.类型,3.。。。。。。。
         * 一般只需要传入加密算法法则就可以。
         * 这里则采用HS256
         *
         * JWSAlgorithm类里面有所有的加密算法法则,直接调用。
         */
        JWSHeader jwsHeader = new JWSHeader(JWSAlgorithm.HS256);

        //建立一个载荷Payload
        Payload payload = new Payload(new JSONObject(payloadMap));

        //将头部和载荷结合在一起
        JWSObject jwsObject = new JWSObject(jwsHeader, payload);

        //建立一个密匙

        JWSSigner jwsSigner = new MACSigner(secret);

        //签名
        jwsObject.sign(jwsSigner);

        //生成token
        return jwsObject.serialize();
    }

验证token

 //解析一个token

    public static Map<String,Object> valid(String token) throws ParseException, JOSEException {

//        解析token

        JWSObject jwsObject = JWSObject.parse(token);

        //获取到载荷
        Payload payload=jwsObject.getPayload();

        //建立一个解锁密匙
        JWSVerifier jwsVerifier = new MACVerifier(secret);

        Map<String, Object> resultMap = new HashMap<>();
        //判断token
        if (jwsObject.verify(jwsVerifier)) {
            resultMap.put("Result", 0);
            //载荷的数据解析成json对象。
            JSONObject jsonObject = payload.toJSONObject();
            resultMap.put("data", jsonObject);

            //判断token是否过期
            if (jsonObject.containsKey("exp")) {
                Long expTime = Long.valueOf(jsonObject.get("exp").toString());
                Long nowTime = new Date().getTime();
                //判断是否过期
                if (nowTime > expTime) {
                    //已经过期
                    resultMap.clear();
                    resultMap.put("Result", 2);

                }
            }
        }else {
            resultMap.put("Result", 1);
        }
        return resultMap;

    }

调用的业务逻辑

//生成token的业务逻辑
    public static String TokenTest(String uid) {
        //获取生成token

        Map<String, Object> map = new HashMap<>();

        //建立载荷,这些数据根据业务,自己定义。
        map.put("uid", uid);
        //生成时间
        map.put("sta", new Date().getTime());
        //过期时间
        map.put("exp", new Date().getTime()+6);
        try {
            String token = TokenUtils.creatToken(map);
            System.out.println("token="+token);
            return token;
        } catch (JOSEException e) {
            System.out.println("生成token失败");
            e.printStackTrace();
        }
        return null;

    }

    //处理解析的业务逻辑
    public static void ValidToken(String token) {
        //解析token
        try {
            if (token != null) {

                Map<String, Object> validMap = TokenUtils.valid(token);
                int i = (int) validMap.get("Result");
                if (i == 0) {
                    System.out.println("token解析成功");
                    JSONObject jsonObject = (JSONObject) validMap.get("data");
                    System.out.println("uid是" + jsonObject.get("uid"));
                    System.out.println("sta是"+jsonObject.get("sta"));
                    System.out.println("exp是"+jsonObject.get("exp"));
                } else if (i == 2) {
                    System.out.println("token已经过期");
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (JOSEException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] ages) {
        //获取token
        String uid = "kkksuejrmf";
        String token = TokenTest(uid);
        //解析token
        ValidToken(token);
    }

总结

JWT 的实践其实还是挺简单。安全性也是得到了保证,后端只需要保存着密匙,其他数据可以保存在token,由前端携带,这样可以减低后端的内心消耗。
虽然token是加密的,但是携带的验证数据还是不要是敏感数据.



作者:蓝汝丶琪
链接:https://www.jianshu.com/p/75208a68c3b9
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

加解密算法及国密算法应用 常见的加解密算法可以分为可逆和不可逆两种。 阅读详情

相关推荐

利用jwt生成或解密token信息

jwt(json web token)是一种能够允许我们在用户和服务器之间传递安全可靠信息的规范。它可以采用对称加密和非对称加密的方式,对我们所要传递的数据进行加密,防止数据的泄露。在web应用中,jwt通常可以结合Spring-security,对访问的页面进行安全保护,如果有需要,可以参照本文参考文献中的内容。本文主要对jwt的类进行封装,生成tocken信息。 JWT 由三...

天涯的博客 2万+

利用JWT生成Token的原理及公钥和私钥加密和解密的原则

开篇: 实现Token的方式有很多,本篇介绍的是利用Json Web Token(JWT)生成的Token.JWT生成的Token有什么好处呢? 安全性比较高,加上密匙加密而且支持多种算法。 携带的信息是自定义的,而且可以做到验证token是否过期。 验证信息可以由前端保存,后端不需要为保存token消耗内存。 小知识:Base64是一种编码,也就是说,它是可以被翻译回原来的样子来的。它并不是一种加密过程。 什么是JWT? JSON Web...

Aplumage的专栏 1万+

Spring Cloud微服务接口鉴权(利用JWT生成的TOKEN)

0 JWT是什么 JWT(JSON Web Token)是一种开放标准,它以一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。 其认证原理是,客户端向服务器申请授权,服务器认证以后,生成一个token字符串并返回给客户端,此后客户端在请求受保护的资源时携带这个token,服务端进行验证再从这个token中解析出用户的身份信息。 0.1 JWT的结构 一个JWT是一个字符串,其由H...

c815852517的博客 2553

jwt token java_利用JWT生成Token

开篇实现Token的方式有很多,本篇介绍的是利用Json Web Token(JWT)生成的Token.JWT生成的Token有什么好处呢?安全性比较高,加上密匙加密而且支持多种算法。携带的信息是自定义的,而且可以做到验证token是否过期。验证信息可以由前端保存,后端不需要为保存token消耗内存。本篇分3部分进行讲解。什么是JWTJWT的代码实现用HS256 对称算法加密用RS256 非对称算...

weixin_33640304的博客 646

【项目实战】HS256 和 HMAC 加密算法

HMAC,是一种基于密钥和哈希函数的消息认证码算法。HMAC,是一种使用密钥的散列算法。HMAC,用于验证数据的完整性和验证发送者的身份。HMAC,结合了密钥和消息内容,生成一个固定长度的认证码(摘要)。HMAC,结合了哈希函数(如SHA-256)和密钥,以产生一个固定长度的认证码(摘要)这个认证码(摘要)可以用于验证消息的完整性和确认消息是否由拥有密钥的发送方发送。这个认证码(摘要)用于验证消息的完整性和发送者的身份。

奶爸的编程之路,也就一周冷个三天 2841

LTspice进阶技巧-031.一键加密仿真模型:LTspice Encrypt Tool实战指南

本文详细介绍了LTspice Encrypt Tool的使用方法,帮助工程师一键加密LTspice仿真模型,保护知识产权。通过图形化界面简化操作流程,支持批量加密和兼容性处理,适用于电路设计中的模型保护需求。

weixin_28304023的博客 202

利用jwt实现token生成

jwt相关依赖 <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> </dependency> 工具类 package com.heima.utils.common; import io.jsonwebtoken.*; import javax.crypto.SecretKey; import javax.cry

weixin_43728298的博客 285

SAP-QM-质检操作

SAP-QM-质检操作

yanzibing99的博客 8179

TP8 利用jwt 生成token

使用Composer安装依赖库,终端切换到项目根目录输入如下。

m0_69254007的博客 1197

小红书私信接口与Hook技术实战:微信跳转卡片的合规与破解之道

本文深入探讨了小红书私信接口与Hook技术的实战应用,重点解析了微信跳转卡片的合规使用与破解方法。通过官方私信接口的合规玩法与Xposed框架的Hook技术对比,为开发者提供了技术选型指南和实战建议,帮助实现高效的用户跳转与转化。

weixin_30399821的博客 736

ArcMap新手必看:5分钟搞定面要素的四至信息提取(附字段重命名技巧)

本文为ArcMap新手提供了快速提取面要素四至信息的详细教程,包括数据准备、坐标系选择、批量处理技巧及字段重命名优化方案。通过实战步骤和Python脚本示例,帮助用户高效完成GIS数据处理任务,特别适合行政区划数据分析和报告生成。

weixin_29266007的博客 384

利用快马平台AI快速生成JWT Token认证系统原型

在整个流程中,我们需要考虑多种异常情况并返回合适的HTTP状态码:注册时用户名已存在(409冲突)、登录凭证错误(401未授权)、请求缺少Token或Token格式错误(401未授权)、Token无效或过期(403禁止访问)、刷新Token无效(403禁止访问)。对于想快速验证一个技术想法、构建概念验证(PoC)或者学习某项技术(比如JWT)的开发者来说,这种从“描述需求”到“获得可运行、可在线访问的原型”的流畅体验,极大地降低了尝试和学习的门槛。这样,任何请求到达这个路由时,都会先经过中间件的检查。

BlackironPanther23的博客 31

SDA 还是 SDI:SAP HANA 数据虚拟化与数据集成的取舍、组合与实战

结论先放在前面:SDA 面向数据虚拟化与联邦查询,强调不落地、不复制、按需实时访问;SDI 面向数据集成与复制,强调抽取、转换、装载与近实时增量同步。两者共享 Remote Source 与 Adapter 的理念,但侧重点与运行时组件明显不同。

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

jwt token 附加用户信息_利用Redis和Jwt实现Token生成,存储,验证方法

#Token存储流程(以登录为例):Client->Server: 发送数据(用户名密码及验证码)Server->Redis: 合法:生成Token,并以Token:username键值对存储Server->Client: 不合法:返回错误信息#Token生成关于token,大家可以查看JSON web Token里面有很多现成的实现库,而且基本涵盖了各类主流语言,我这儿就已j...

weixin_36358383的博客 948

本地部署DeepSeek并搭建量化交易系统:完整指南

本地部署DeepSeek并搭建量化交易系统指南 本文提供了一套完整的本地部署DeepSeek大语言模型并构建量化交易系统的技术方案。系统包含以下核心组件: 环境配置:详细说明Ubuntu系统、NVIDIA显卡驱动、CUDA和Python环境的安装要求,推荐使用conda管理依赖 DeepSeek部署: 通过HuggingFace下载7B或13B量化版本模型 使用4-bit量化技术降低显存需求 封装为FastAPI服务提供推理接口 量化系统架构: 模块化设计,各组件通过Redis解耦 包含数据获取、因子计算、

huanghm88的专栏 477

高精地图构建:Lidar SLAM与视觉SLAM对比

高精地图构建:Lidar SLAM与视觉SLAM对比​ ,人工智能,计算机视觉,大模型,AI,本文围绕高精地图构建,对比 Lidar SLAM 与视觉 SLAM。Lidar SLAM 通过激光获取点云数据,精度高、环境适应性强但成本高、数据量大;视觉 SLAM 利用图像,成本低、信息丰富却受光照影响大、深度获取难。还解析了 SLAM、点云等关键概念,介绍了两者融合趋势、应用案例、技术挑战及未来方向,也给出常见问题解答,为相关领域应用与学习提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 17万+

利用Redis和Jwt实现Token生成,存储,验证方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33790053的博客 3851

基于YOLOv8的铁路轨道异物检测系统设计与实现

目标检测是计算机视觉领域的核心任务之一,旨在识别图像中特定目标的位置和类别。传统方法主要依赖手工特征(如HOG、SIFT等)和分类器(如SVM),而深度学习方法通过卷积神经网络自动学习特征表示,显著提升了检测性能。YOLO(You Only Look Once)系列算法作为单阶段目标检测的代表,以其高效的检测速度著称。YOLOv8是Ultralytics公司于2023年发布的最新版本,在精度和速度上都有进一步提升。

YOLO 574

利用快马AI快速生成JWT Token验证的API安全原型

不需要从零开始搭建项目,AI辅助生成的代码骨架已经处理了大部分基础工作,我只需要关注核心业务逻辑就行。整个过程从构思到上线只用了不到两小时,这在以前手动配置各种环境的情况下是不可想象的。前端用最简单的HTML+JS实现,后端选择了Express框架,配合jsonwebtoken这个库来处理token。最惊喜的是它的一键部署功能,点个按钮就把我的demo变成可公开访问的在线服务了,同事可以直接体验完整流程。最近在做一个需要用户权限管理的小项目,正好尝试用JWT来实现API的安全验证。

JetRaven12的博客 45

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

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

java利用der文件生成JWT token

maven: <!-- https://mvnrepository.com/artifact/com.auth0/java-jwt --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.9.0</version> </dependency> j

QAQ_666666的博客 1059

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

接口使用jwt返回token_利用Redis和Jwt实现Token生成,存储,验证方法

注意:下文中代码对Redis的操作并没有写出来,只是简单的以注释表达出了Redis需要执行的操作,如果有需要的可以参考上一篇文章spring简单整合Redis配置 自行配置#Token存储流程(以登录为例):Client->Server: 发送数据(用户名密码及验证码)Server->Redis: 合法:生成Token,并以Token:username键值对存储Server->C...

weixin_39630498的博客 700

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Laravel8 利用passport实现登录和JWT生成(生成Token)

1.安装passport插件 composer require laravel/passport 或 composer require laravel/passport "^9.0" 2.执迁迁移文件,生成数据表,保存token数据 php artisan migrate 3.生成客户端授权码 注:secret保存起来 php artisan passport:install 4.修改接口账号模型 5.修改config/auth.php文件中的api配置 6.令牌...

Dragon 1462
上一篇: 转自GitHub上拥有4万+star的大佬
下一篇: 自定义注解的使用
mastertojava
博客等级 码龄9年 9粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值