【开发日记】Token的使用及Token的构成
1、Token
Token英文直译过来是“令牌”的意思,什么是令牌,在古代你要通过城门需要的也是令牌,而在计算机系统中要通过的是计算机的大门。
古代的大门由士兵守卫,而计算机系统的大门也有“士兵”,如果你没有一个有效的令牌就无法通过,只能从哪来回哪去。
2、POM依赖
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.10.3</version>
</dependency>
3、生成Token
public static String getAdminToken(Admin admin) {long time = System.currentTimeMillis() + (1000 * 60 * 60 * 24);Date date = new Date();date.setTime(time);return JWT.create().withAudience(admin.getId()) // 将用户ID存入token中.withExpiresAt(date) // 设置过期时间.sign(Algorithm.HMAC256(admin.getId()));// 设置私钥为用户ID
}
如上方法会返回一个一段字符串:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJhdWQiOiIxIiwiZXhwIjoxNjUyMDAzMjM4fQ
.cEkaKlNiA7OMJAv5hZI9hmRksujg08l00BwzpwwfhpE
如上Token中含有两个英文点,这两个英文点可将字符串分为三段。
第一段-头部(Header)
我们通过使用Base64解码第一段后得到如下内容:
{"typ":"JWT","alg":"HS256"
}
上面描述了我们使用了HS256算法对Token进行了签名。
第二段-负载(Payload)
我们通过使用Base64解码第二段后得到如下内容:
{"aud":"1","exp":1652003238
}
这里的内容不是必须的,是之前我们在生成Token时设置的一些内容。
aud(audience)可以理解为读者,如果客户端有多个类型,那么我们在分发Token时就可以约定一个类型,以便在验证时进行区分。
exp(expiration time)是过期时间,也是我们在生成Token时做的约定。
第二段负载中的内容可以自定义,但是这段内容并没有被加密,所以不要将密码等敏感信息放在这里。
第三段-签名(Signature)
我们通过使用Base64解码第三段后得到如下内容:
pI*Sb$=ddt3
是一段乱码,需要使用第一段中加密方式并配合私钥才可以解码其中的内容。
4、验证Token
String token = request.getHeader("token");
String adminID = request.getHeader("adminID");
if (token == null ) {returnJson(response, "请求未授权");return false;
}
// 解码
DecodedJWT decode = JWT.decode(token);
// 验证密钥是否正确
Algorithm algorithm = Algorithm.HMAC256(adminID);
algorithm.verify(decode);
// 有效期是否超时
Date expiresAt = decode.getExpiresAt();
if(expiresAt.getTime()<System.currentTimeMillis()){returnJson(response, "Token未授权或已超时");return false;
}
return true;
验证Token是否正确建议在拦截器或过滤器中进行,这里返回true表示Token有效,false为无效,无效的Token会被拦截,不会继续向下执行,控制层不会处理该请求。
5、升级Token安全性
我们可以在上面看出,在验证Token时会判断Token是否失效,但是Token过期时间在Payload中是非加密状态,也就是可以被修改,所以我们可以在服务端设置一个验证机制。
我们可以使用Redis作为存储Token时效的容器,在验证Token是否有效时可以对Redis进行访问验证;如果不想添加Redis的依赖,可以本地封装一个有时效的Map集合对Token进行保存。
【开发日记】Token的使用及Token的构成相关推荐
- 以太坊转账参数java_【ETH钱包开发04】web3j转账ERC-20 Token
在上一篇文章中讲解了ETH转账,这一篇讲一下ERC-20 Token转账. [ETH钱包开发03]web3j转账ETH ERC-20 Token转账的2种方式 1.直接用web3j的API 2.jav ...
- Nancy跨平台开发总结(六)三层架构之Token认证的Rest API
在开始写本节内容前,我使用Nancy.Authentication.Token实现的Token认证,但是就在我开始写本节内容的时,我看到Nancyfx的文档中的内容更新 所以我改为使用Nancy.Au ...
- python token 访问控制_python 产生token及token验证
1.前言 最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击. 在经过再三思考之后,自己试着实现一个产生token和验证to ...
- go token验证_golang jwt+token验证的实现
Token验证是验证用户身份的重要方式,在golang开发中具有广泛应用,文中主要阐述了利用jwt包加密后的token验证. 导入包: import ( "github.com/dgrija ...
- 什么是token,如何使用token
什么是token? 对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不知道为什么要用他?更不知道其原理,今天我就带大家一起分析分析这东西. 一.我们先解 ...
- JWT,springboot整合JWT完成token的验证,token的使用,java架构师技术栈
/** @author dugt1998@163.com @date 2020/11/8 12:40 */ public class JWTUtils { //签名 自己项目中的签名 private ...
- python怎么获取token值_python 产生token及token验证
1.前言 最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击. 在经过再三思考之后,自己试着实现一个产生token和验证to ...
- 广东海洋大学体育馆管理系统 开发日记2
GYM用来对体育馆进行管理,主要功能包括人员管理.场地使用管理.体育赛事管理.器材管理.运营金额数据报表. GYM包括三种角色(Actor): 1. 普通用户(User) 普通用户指的是GYM系统 ...
- 开发日记-20190513 关键词 汇编语言(六)
其实,每次当我写一篇开发日记,并且这篇开发日记并没有关键词,或者我并没有和你扯东扯西的情况下... 这意味着我这天偷懒了= = ;AddTwo.asm --两个32位整数相加.386.model fl ...
- 开发日记-20190328 关键词 利用eolinker一键快速生成API接口文档
今天感觉效率真的很低= =各个层面的,apk发布到现场发现出现了问题,所以一个下午都在忙着解决现场出现的问题,领导一直打电话询问进度,午觉也没有睡所以今天预计的很多计划都处于停滞状态,像昨天规划的今天 ...
最新文章
- golang 如何判断变量的类型
- php escape undfine,PHP中处理 undefined variable的方法 | Soo Smart!
- 【CodeForces - 569C】Primes or Palindromes? (思维,分析范围,暴力枚举判断)
- C++/mfc错误总结
- Android studio 常用的插件
- steam令牌 未能连接到服务器,连接错误无法连接到steam网络怎么办 steam网络连接错误解决方法【图文】...
- 基于Python的IMDB电影评论文本分类
- svn创建版本库以及创建其下目录
- VLAN间的三层通信
- PYTHON开发毕业设计做什么好鸭?
- Linux驱动学习笔记之触摸屏驱动
- 学习英文-学以致用【场景:常说错的中式英文】
- CSDN上代码块背景颜色的设置
- 重启服务器后hyperv虚拟机没了,微软Hyper-V 虚拟化和灾难恢复
- Google新动作频出 Google Trends发布
- Qt编写安防楼宇对讲管理平台源码
- 子域名收集工具——Sublist3r
- 论文查重渠道和有效的降重方法
- Nginx+Lua+FastDFS+Docker实现图片缩略图
- 社会群体及分层问题研究类毕业论文文献都有哪些?