JWT 生成Token及Token的校验

1 篇文章 0 订阅
1 篇文章 0 订阅

JWT方式特点:

  • 用户登录后服务器通过JWT生成一串随机Token给到用户(服务器不保留Token信息),当用户再来访问时需要携带Token信息,服务器收到用户端的Token之后,通过JWT对Token进行校验是否超时和合法。

    JWT Token格式:
    jwt token 是由三段字符串通过"."连接组成:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsInZlcnNpb24iOiIxLjAiLCJ0cyI6IjIwMjEwMjAzMTIzIiwic2VyaWFsSWQiOiJ4eHh4eHgiLCJoYXNoIjoieHh4eHh4In0.eyJ1c2VySWQiOiIwMDEiLCJ1c2VyTmFtZSI6InpoYW5nc2FuIiwiZXhwIjoxNjIxOTEwNDYxfQ.vINBnYx8nRxJNgvsQb5FZ0pCwWeH6yWeEoMRm_pDTIU

生成规则:

  1. 第一段为header部分(json格式),固定包含token的加密算法和类型,对此部分进行base64url加密

{
“typ”: “JWT”,
“alg”: “HS256”,
“version”: “1.0”,
“ts”: “20210203123”,
“serialId”: “xxxxxx”,
“hash”: “xxxxxx”
}

  1. 第二段为payload部署(json格式),自定义用户数据信息,对此部分进行base64url加密

{
“userId”: “001”,
“userName”: “zhangsan”,
“exp”: 1621909898
}

  1. 第三段为signature部分,将第一段和第二段的base密文通过"."进行拼接后使用hs256加密码后再对加密后的密文进行base64url加密,最终生成token的第三段密文

HMACSHA256(
base64UrlEncode(header) + “.” +
base64UrlEncode(payload),
your-256-bit-secret

)

Python 代码

#! /usr/bin/python3
# -*- encoding:utf8 -*-


import jwt
import datetime, time


def createToken():
    salt = 'abc@1234'

    orgData = {
        "version": "1.0",
        "ts": "20210203123",
        "serialId": "xxxxxx",
        "hash": "xxxxxx",
    }

    payload = {
        'userId': '001',
        'userName': 'zhangsan',
        'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=1)
        # exp 配置token有效时长
    }

    token = jwt.encode(payload=payload, key=salt, algorithm='HS256', headers=orgData)

    return token


def checkToken(token):
    salt = 'abc@1234'
    try:
        data = jwt.decode(token, salt, algorithms=['HS256'])
        return data
    except jwt.ExpiredSignatureError:
        return 'Token已失效'
    except jwt.DecodeError:
        return 'Token认证失败'
    except jwt.InvalidTokenError:
        return '无效的Token'


d1 = createToken()
print(d1)

d2 = checkToken(d1)
print(d2)

time.sleep(65)

d3 = checkToken(d1)
print(d3)

代码结果:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsInZlcnNpb24iOiIxLjAiLCJ0cyI6IjIwMjEwMjAzMTIzIiwic2VyaWFsSWQiOiJ4eHh4eHgiLCJoYXNoIjoieHh4eHh4In0.eyJ1c2VySWQiOiIwMDEiLCJ1c2VyTmFtZSI6InpoYW5nc2FuIiwiZXhwIjoxNjIxOTEwNDYxfQ.vINBnYx8nRxJNgvsQb5FZ0pCwWeH6yWeEoMRm_pDTIU
{‘userId’: ‘001’, ‘userName’: ‘zhangsan’, ‘exp’: 1621910461}
Token已失效

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值