JWT验证机制【Python版Flask或自己写的后端可以用】【刘新宇】
2024-09-19 08:49:28
JWT
Json Web Token(JWT)
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息。
官方定义:JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties
JWT是一个有着简单的统一表达形式的字符串:
头部(Header)
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。
载荷(PayLoad)
payload的五个字段都是由JWT的标准所定义的。
- iss: 该JWT的签发者
- sub: 该JWT所面向的用户
- aud: 接收该JWT的一方
- exp(expires): 什么时候过期,这里是一个Unix时间戳
- iat(issued at): 在什么时候签发的
后面的信息可以按需补充。 JSON内容要经Base64 编码生成字符串成为PayLoad。
签名(signature)
这个部分header与payload通过header中声明的加密方式,使用密钥secret进行加密,生成签名。 JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。
JWT的Python库
独立的JWT Python库
itsdangerous
- JSONWebSignatureSerializer
- TimedJSONWebSignatureSerializer (可设置有效期)
pyjwt
安装
$ pip install pyjwt
用例
>>> import jwt >>> encoded_jwt = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
>>> encoded_jwt
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg' >>> jwt.decode(encoded_jwt, 'secret', algorithms=['HS256'])
{'some': 'payload'}
示例代码:产生与校验
import jwt from flask import current_app
def generate_jwt(payload, expiry, secret=None):
""" 生成jwt
:param payload: dict 载荷
:param expiry: datetime 有效期
:param secret: 密钥
:return: jwt
"""
_payload = {'exp': expiry}
_payload.update(payload)
if not secret:
secret = current_app.config['JWT_SECRET']
token = jwt.encode(_payload, secret, algorithm='HS256')
return token.decode() def verify_jwt(token, secret=None):
""" 检验jwt :param token: jwt :param secret: 密钥 :return: dict: payload """
if not secret:
secret = current_app.config['JWT_SECRET']
try:
payload = jwt.decode(token, secret, algorithm=['HS256'])
except jwt.PyJWTError:
payload = None
return payload
最新文章
- .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式
- 【BZOJ-1857】传送带 三分套三分
- 随便2--struct pointer
- Python学习笔记-Day3-python关键字
- Puppet
- 打开Openstack dashboard出现Internal Server Error
- 运行容器的最佳实践 - 每天5分钟玩转 Docker 容器技术(24)
- react入门到进阶(三)
- Docker搭建MongoDB
- intellij idea 相关设置
- Python3网络爬虫(四):使用User Agent和代理IP隐藏身份《转》
- 251. Flatten 2D Vector 平铺二维矩阵
- 【AtCoder】ARC083
- leetcode 两数之和 II - 输入有序数组
- 学习Android Studio里的Gradle
- YC全球总裁:我招揽陆奇好多年,如今终于如愿了!
- 使用getid3获取音频文件信息
- 深入了解View的绘制流程
- MySQL性能调优思路
- 基于任务的异步编程模式,Task-based Asynchronous Pattern