JWT(简述一下,附简单代码例子)

什么是JWT?

JSON Web令牌(Json Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对对JWT进行签名。

组成是什么?

JWT主要分成三个部分组成,这些部分由点(.)分隔:
第一部分:header: 头部 标记使用什么算法。如HS256等。
第二部分:PayLoad(载荷):jwt存放的数据
第三部分:sign: PayLoad采用MD5加密后的签名值

格式为:xxxxx.yyyyy.zzzzz

举例一下:

标头

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

载荷

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}`

签名
如果要使用HMAC SHA256算法,则将通过以下方式创建签名:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

JWT的生成

  • Base64.ENcode ( header). Base64.ENcode ( PayLoad).签名值

注意:

  • Base64 不属于对称加密,属于一种编码方式。header和 payload都是用Base64编码,而签名一般采用的是不可逆的hash(ma5)算法。

下面附上一些简单的代码实现

import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JWT {
    //签名key 设置盐值 (注意盐值的不能低于三个,低于三个会报错)
    private static String SIGN_KEY = "wsw123";

    public static void main(String[] args) {

        //创建jwt
        JwtBuilder jwtBuilder = Jwts.builder().claim("phone", "1335860166")
                //设置签名值
                .signWith(SignatureAlgorithm.HS256, SIGN_KEY);

        System.out.println(jwtBuilder.compact());

    }
}

运行结果为(是一个格式为:xxxxx.yyyyy.zzzzz):

eyJhbGciOiJIUzI1NiJ9.
eyJwaG9uZSI6IjEzMzU4NjAxNjYifQ.
0qhhcLJP-VItLB3VdAc37vtCnOMaBd-60xrdx0dlIHo

将其对应到JWT官网上:

https://jwt.io/#debugger-io
在这里插入图片描述
我将代码中的盐值输入进去,就会得到下面截图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,根据提供的引用内容,无法为您提供完整的JWT双令牌实现续签代码。但是,我可以为您提供一些思路和建议来解决JWT续签的问题。 JWT续签的基本思路是在JWT过期之前,使用刷新令牌(refresh token)来获取新的JWT。下面是一个简单JWT续签的代码示例: ```python import jwt import datetime # 定义JWT过期时间和刷新令牌过期时间 JWT_EXPIRATION_DELTA = datetime.timedelta(minutes=30) REFRESH_TOKEN_EXPIRATION_DELTA = datetime.timedelta(days=30) # 生成JWT和刷新令牌 def generate_tokens(user_id): # 生成JWT payload = { 'user_id': user_id, 'exp': datetime.datetime.utcnow() + JWT_EXPIRATION_DELTA } jwt_token = jwt.encode(payload, 'secret_key', algorithm='HS256') # 生成刷新令牌 refresh_token_payload = { 'user_id': user_id, 'exp': datetime.datetime.utcnow() + REFRESH_TOKEN_EXPIRATION_DELTA } refresh_token = jwt.encode(refresh_token_payload, 'secret_key', algorithm='HS256') return jwt_token, refresh_token # 刷新JWT def refresh_jwt(refresh_token): try: # 验证刷新令牌 payload = jwt.decode(refresh_token, 'secret_key', algorithms=['HS256']) user_id = payload['user_id'] # 生成新的JWT new_jwt_token = jwt.encode({ 'user_id': user_id, 'exp': datetime.datetime.utcnow() + JWT_EXPIRATION_DELTA }, 'secret_key', algorithm='HS256') return new_jwt_token except jwt.ExpiredSignatureError: # 刷新令牌过期 return None ``` 在上面的代码中,`generate_tokens`函数用于生成JWT和刷新令牌,`refresh_jwt`函数用于刷新JWT。当JWT过期时,客户端可以使用刷新令牌来获取新的JWT

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值