-
2020-12-15 10:32:50
通过jwt组件生成的token分为 header、payload、signature三部分,通过.连接
第一部分 header
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
base64解密后
{"typ":"JWT","alg":"HS256"}
第二部分payload
{"iss":"","iat":1607949872,"exp":1609159472,"nbf":1607949872,"jti":"teQbWN5XTzwP2UeP","sub":100000,"prv":"23bd5c8949f600adb39e701c400872db7a5976f7"}
第三部分
vbfP8JYAgFZslXBfVcPzzbQjSaRSHlWmIkiznmdNZzA
signature,这个是根据 header+payload 的拼接再加上 secret 经过某种方式加密形成的 (核心)。
大概流程是
将一二部分和秘钥通过hash_hmac函数生成的值
再用base64url加密一次更多相关内容 -
详解JWT token心得与使用实例
2021-01-21 12:34:02JWT token的组成 头部(Header),格式如下: { “typ”: “JWT”, “alg”: “HS256” } 由上可知,该token使用HS256加密算法,将头部使用Base64编码可得到如下个格式的字符串: eyJhbGciOiJIUzI1NiJ9 有效... -
jwt介绍二:Token组成方式
2021-03-03 17:18:33背景 公司处在前后端分离的转折阶段,作为后端人员,要找到一个适用于接口验证的方式,公司仍保持后端使用Laravel框架,而laravel框架默认的...JWT:全称Json Web Token,是一种规范化的token。可以理解为对token这一技背景
公司处在前后端分离的转折阶段,作为后端人员,要找到一个适用于接口验证的方式,公司仍保持后端使用Laravel框架,而laravel框架默认的是【web】方式,web 方式是使用 session 来进行用户认证,当然也是可以使用,但是有一定的不安全,经过调研,主流使用的Token验证方式。
介绍JWT
JWT资料
JWT:全称Json Web Token,是一种规范化的token。可以理解为对token这一技术提出的一套规范,是在RFC 7519中提出的。
JWT的Token组成
The Anatomy of a JSON Web Token,这里详细介绍了什么是JWT、JWT的构成等。本篇部分内容摘自这里。
一个JWT token是一个字符串,它由三部分组成:header(头部)、payload(载荷)、signature(签名)1.header
头部通常由两部分组成,令牌的类型(即JWT)和正在使用的签名算法(如:HMAC SHA256),例如:
{ "alg": "HS256", "typ": "JWT" }
然后使用Base64encode编码该json串得到头部,即xxxx
2.payload
载荷中存放了一些我们要传输的信息和其他有关令牌的信息,来帮助服务器理解这个tomen,同时也可以包含一些自定义的信息,用户信息交换等。不过数组越大,得到的token就会越长,所以不建议放太多数据。又因为载荷是用base64encode编码,相当于明文了,所以决定不能存密码等敏感信息。
载荷的属性分为三类:
- 预定义(registered)
- 公有(public)
- 私有(private)
预定义载荷
公有载荷
在使用 JWT 时可以额外定义的载荷。为了避免冲突,应该使用 IANA JSON Web Token Registry中定义好的,或者给额外载荷加上类似命名空间的唯一标识。
私有载荷
在信息交互的双方之间约定好的,既不是预定义载荷也不是公有载荷的一类载荷。这一类载荷可能会发生冲突,所以应该谨慎使用。(不过具体为啥会冲突,待了解)
{ "sub": "1", //主题 "iss": "http://localhost:8000/auth/login", // 签发人 "iat": 1451888119, //签发时间戳 "exp": 1454516119, //过期时间戳 "nbf": 1451888119, //生效时间戳,在此之前token无效 "jti": "37c107e4609ddbcc9c096ea5ee76c667", //编号 "aud": "dev" //受众 }
对上述json串同header一样,encode得到一个串,然后分到token的第二部分,载荷,即yyyy
3.signature
令牌第三部分由以下哈希组成:
- the header
- the payload
- secret
根据第一部分的加密方式进行加下,如果以HMACSHA256加密,如下:
$encode_string = base64UrlEncode(header) + "." + base64UrlEncode(payload); $signature = HMACSHA($encode_string, 'secret');
上述得到的signature,在同第一步一样进行encode,就得到了第三部分,即zzzz
签名的作用:保证JWT没有被篡改过,原理如下:
HMAC 算法是不可逆算法,类似 MD5 和 hash ,但多一个密钥,密钥(即上面的 secret)由服务端持有,客户端把 token 发给服务端后,服务端可以把其中的头部和载荷再加上事先共享的 secret 再进行一次 HMAC 加密,得到的结果和 token 的第三段进行对比,如果一样则表明数据没有被篡改。
写在最后
其实真正集成使用的时候,基本没有修改过这些东西,毕竟自己还是个菜鸟,所以记录一份,了解一下
【前程栽树,后人乘凉】
JWT超详细分析
JWT-Auth了解
JWT 完整使用详解
-
thinkphp框架使用JWTtoken的方法详解
2021-01-03 01:06:23本文实例讲述了thinkphp框架使用JWTtoken的方法。分享给大家供大家参考,具体如下: 简介 一:JWT介绍:全称JSON Web Token,基于JSON的开放标准((RFC 7519) ,以token的方式代替传统的Cookie-Session模式,用于各... -
JWT Token 的构成以及生成过程
2022-04-27 09:12:39一.jwt token 是什么样子的 JWT是由三段信息构成的,将这三段信息文本用点链接一起就构成了Jwt字符串 # JWT字符串 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9...一.jwt token 是什么样子的
JWT是由三段信息构成的,将这三段信息文本用
点
链接一起就构成了Jwt字符串# JWT字符串
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
二.JWT的构成
第一部分我们称它为头部(header)
jwt的头部承载两部分信息:
1是声明数据类型 这里用jwt
2是加密算法 这里用 HMAC SHA256
格式例:
{ 'typ': 'JWT', 'alg': 'HS256' }
然后将头部进行base64编码,其中的”=“号占位符替换为”“(也就是空字符),构成了第一部分:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
第二部分我们称其为载荷(payload, 类似于飞机上承载的物品)
载荷就是存放有效信息,这些有效信息包含三个部分
· 标准中注册的声明(JWT官方规定的,建议但不强制使用) :
· iss: jwt签发者
· sub: jwt所面向的用户
· aud: 接收jwt的一方
· exp: jwt的过期时间,这个过期时间必须要大于签发时间
· nbf: 定义在什么时间之前,该jwt都是不可用的.
· iat: jwt的签发时间
· jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
· 公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分在客户端可解码.
· 私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解码的,意味着该部分信息可以归类为明文信息。
payload格式例:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
然后将其进行base64编码,”=“号占位符替换为”“,得到Jwt的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
第三部分是签名(signature)
jwt的第三部分是一个签名信息,由三部分组成:
· header (base64后的)
· payload (base64后的)
· secret
这个部分需要base64编码后的header和base64编码后的payload使用
.
连接组成的字符串,然后通过header中声明的加密方式进行加盐secret
组合加密,然后base64编码,就构成了jwt的第三部分。HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
将这三部分用`.`连接成一个完整的字符串,构成了最终的jwt
# jwt tokend:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ -
JWT Token生成
2021-09-01 18:27:58Jwt token生成的方式有几种,可根据具体情况决定生成方式,以下为本人使用的一种,仅供参考。 官网地址:https://jwt.io/introduction 1.jwt生成的Token格式 eyJhbGciOiJIUzI1NiJ9.eyJqd3RDbGFpbSI6eyJ1c2...Jwt token生成的方式有几种,可根据具体情况决定生成方式,以下为本人使用的一种,仅供参考。JWT官网链接
1.jwt生成的Token格式
eyJhbGciOiJIUzI1NiJ9.eyJqd3RDbGFpbSI6eyJ1c2VySWQiOiIyIiwiYXBpSWRzIjoiMSwyLDMiLCJuYW1lIjpudWxsfSwiaWF0IjoxNjMwNDg3MjA5LCJleHAiOjE2MzA0OTQ0MDl9.apV5AqF6tgeVOcZZgHztsoGVCsv8b-M3ipExC6E7eUE
2.jwt生成Token的结构
2.1 jwt生成的token由三部分组成
Header(头部)Payload(负载)Signature(签名)
格式为:Header.PayLoad.Signature (中间由符号“.”链接)与生成的token相对应
2.2 Header
{ "alg": "HS256", "typ": "JWT" }
alg表示签名的算法,默认为SHA256,写作“HS256”,typ表示令牌的类型,JWT统一为“JWT“
2.3 Payload
Payload官方名称为负载,用来存放实际需要存放的数据,官方给出了7个参考字段,也可以自定义参数,在这里需要注意的是这部分是json对象根据Base64转化而成,不进行加密,所以需要注意不要存储私密信息。
//官方推荐参数 iss (issuer):签发人 exp (expiration time):过期时间 sub (subject):主题 aud (audience):受众 nbf (Not Before):生效时间 iat (Issued At):签发时间 jti (JWT ID):编号
2.4 Signature
Signature是由Header加Payload根据密钥(secret自行设置)以及指定的加密方式生成
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
3.jwt token生成
3.1 引入jar包
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version> 3.10.0</version> </dependency>
3.2 生成,解析Token
token生成我使用了两种方式,最终采用了第一种,原因是更简洁,和自定义数据存取方便,大家在使用时可以根据自己情况使用。
public class JwtUtils { public static final String CLAIM_NAME = "jwtClaim"; /** * 生成 jwt token */ public static String creatJwt(JwtClaim jwtClaim, Long tokenExpireTime, String secretKey) { Date now = new Date(); Date date = new Date(now.getTime() + tokenExpireTime);//根据当前时间 + tokenExpireTime(token有效期,以毫秒为单位 例:7200000为2小时) return Jwts.builder() .claim(CLAIM_NAME, jwtClaim)//jwtClaim为自定义对象,存放自定义参数(数据存放在Payload) .setIssuedAt(now)//生成时间 .setExpiration(date)//token到期时间 .signWith(SignatureAlgorithm.HS256, secretKey)//加密方式,secretKey自定义密钥 .compact(); } /** * 解析 jwt */ public static Claims parseJwt(String token, String secretKey) { try { //注掉代码为完整的获取自定义对象参数的方式,为注掉的为我工具类方法 // JwtTokenDto jwtTokenDto = new JwtTokenDto(); // Claims body = Jwts.parser() // .setSigningKey(secretKey)//secretKey密钥 // .parseClaimsJws(token)//需要解析的token // .getBody();//获取存入的参数及自定义的jwtClaim对象中的参数 // BeanUtil.copyProperties(body.get(JwtUtils.CLAIM_NAME), jwtTokenDto); // return jwtTokenDto; return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody(); } catch (ExpiredJwtException e) {//此异常为生成的token过期异常 log.info("校验的token过期!"); throw new BusinessException("Token过期!", ResponseParameter.CODE_HTTP_XXX);//自定义异常处理类 } } //第二种token生成方式 // /** // * 生成 jwt token // */ // public static String creatJwtTo(String userId){ // // Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);//SECRET_KEY自定义密钥 // // 设置头信息 // HashMap<String, Object> header = new HashMap<>(2); // header.put("typ","JWT"); // header.put("alg","HS256"); // // TokenVo tokenVo = new TokenVo(); // // 生成 Token // String token = JWT.create().withHeader(header) // // .withClaim("userId", userId)//自定义参数 // .withClaim("userName",header)//自定义参数 // .withClaim("test","test")//自定义参数 // .withExpiresAt(new Date(System.currentTimeMillis() + TOKEN_EXPIRE_TIME)).sign(algorithm);//TOKEN_EXPIRE_TIME token过期时间毫秒 // return token; // // } // // // /** // * 解析 jwt // */ // public static Map<String, Claim> parseJwtTo(String token){ // Map<String, Claim> claims = null; // try { // Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);//SECRET_KEY自定义密钥 // JWTVerifier verifier = JWT.require(algorithm).build(); // DecodedJWT jwt = verifier.verify(token);//需要解析token // claims = jwt.getClaims(); // return claims; // } catch (Exception e) { // return null; // } // } }
-
JWT token心得与使用实例
2021-03-16 22:23:20token在客户端与服务器端的交互流程Token的优点和思考参考代码:核心代码使用参考,不是全部代码JWT token的组成头部(Header),格式如下:{“typ”: “JWT”,“alg”: “HS256”}由上可知,该token使用HS256加密算法... -
JwtToken介绍与使用 超详细保姆级教程 内附详细示例代码
2021-11-24 23:26:54文章目录一、什么是JWT认证二、JWT认证的特点优点:缺点:三、JWT的组成四、JWT代码展示 一、什么是JWT认证 Json web token (JWT),根据官网的定义,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准... -
php实现JWT(json web token)鉴权实例详解
2021-01-03 01:18:58JWT由三个部分组成:header.payload.signature 以下示例以JWT官网为例 header部分: { alg: HS256, typ: JWT } 对应base64UrlEncode编码为:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 说明:该字段为jso -
JwtToken原理
2019-06-21 19:39:12JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象安全传输信息。 这些信息可以通过数字签名进行验证和信任。 可以使用... -
javaApi JWT token生成以及验证
2021-09-30 17:38:20JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。也就是说, 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全。 在身份... -
JWT token生成原理
2022-02-22 17:57:38JWT包含三部分:Header(头部),Payload(负载),Signature(签名) //Signature生成 var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload); //通过header中声明的加密方式进行加盐... -
Jwt的Token详解
2021-09-16 20:57:25 简单来说,token就是一种身份验证方法,和cookie有相似作用;它被很多人翻译过来后生动的称为“令牌”,它的扩展性,安全性更高,非常适合用在Web应用和移动开发应用上。 1.1token验证流程 使用token身份验证... -
手动实现JWT token的生成
2022-04-22 11:18:32token由三部分组成,这三部分的生成流程如下 第一部分 对header {‘typ’:“JWT”, ‘alg’:“HS256”}进行base64编码,然后将结果两边的"=“删除, 得到第一部分。 第二部分 对payload {“username”:“wjh”, …}... -
JWT Token 入门篇
2020-12-13 16:55:50JWT Token 入门篇 这里记录下自己学习jwt的过程。 什么是JWT JSON Web Token(缩写 JWT),是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的自定义格式。用于在通信双方传递json对象,传递的信息经过... -
springboot jwt token前后端分离_前后端分离之JWT用户认证
2020-12-06 08:14:34自包含(Self-contained) 负载中包含了所有用户所需要的信息,避免了多次查询数据库 JWT 组成 Header 头部 头部包含了两部分,token 类型和采用的加密算法 { "alg": "HS256", "typ": "JWT" } 它会使用 Base64 编码... -
JWT token
2017-12-05 11:37:48转自:... 本文你能学到什么? token的组成 token串的生成流程。...token在客户端与服务器端的交互流程 ...Token的优点和思考 ...JWT token的组成 头部(Header),格式如下: { “t -
JWT生成Token及解析Token
2021-02-19 22:32:30JWT生成Token详解 【第一部分】历史文章: SpringBoot总结(一)——第一个SpringBoot项目 SpringBoot总结(二)——Spring Boot的自动配置 SpringBoot总结(三)——SpringBoot的配置文件 SpringBoot总结(四)——... -
Laravel JWT实现Token认证
2021-06-05 09:24:30简单示例:JWT—Token的认证 composer require firebase/php-jwt JWT 加密 // JWT 加密 public function setJwt() { // 自定义随机字符串 $key = "hao"; $payload = array( // 签发者 "iss" => "", //... -
Django实战: 使用JWT Token进行用户认证
2020-04-20 00:05:36编者注:一般Web应用开发验证用户信息有两种方式,一是使用session,二是使用token。下文详细对比了两者的区别,介绍了Token认证的原理及如何在Django项目简单实现tok... -
【SpringBoot深入浅出系列】SpringBoot之集成JWT实现token验证
2022-02-22 20:23:42签名(Signature)五、创建项目集成 JWT 实现 token 验证1.项目说明2.创建 Spring Initializr 项目 jwt(1).添加依赖(2).添加配置(3).新建实体类 User(4).新建 JWT 工具类 JwtUtils(5).新建控 -
SpringBoot 整合 JWT 实现 Token 登录验证的简单实现
2021-11-19 17:49:34SpringBoot 整合 JWT 实现 Token 登录验证的实现 在实现案例之前,要先去理解 JWT 的概念 以及 它与传统方式的区别和优点。 1、什么是 JWT? JSON WEB TOKEN (JWT),是为了在网络应用环境间传递声明而执行的一种... -
【第十一篇】SpringSecurity基于JWT实现Token的处理
2022-05-26 21:25:31SpringSecurity基于JWT实现Token的处理 前面介绍了手写单点登录和JWT的应用,本文结合SpringSecurity来介绍下在SpringBoot项目中基于SpringSecurity作为认证授权框架的情况下如何整合JWT来实现Token的处理。 一... -
SpringBoot集成JWT实现token验证
2022-06-03 10:39:00有关session存储用户信息在spring系列...JWT全称JSON Web Token,实现过程简单的说就是用户登录成功之后,将用户的信息进行加密,然后生成一个token返回给客户端,与传统的session交互没太大区别。省掉了redis,把 -
JWT_token是什么
2022-05-08 14:36:16JWT_TOKEN -
react前端axios使用jwt token依然401 踩坑
2021-04-07 19:50:49调试完成Django drf jwt授权后在前端使用token请求授权接口依然是401,没有直接处理完成,记录处理过程以便分析 请求与生成token供前端使用参见《前后端分离使用drf jwt的token鉴权》 准备 axios使用用户名与密码... -
JWT Token的基本使用和基本流程
2019-10-15 16:43:18JWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上...