Flask中的JWT
Flask中的JWT
Flask中的JWT
JWT认证
Json Web Token(JWT)
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息。
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?
解析: jwt (JSON WEB TOKEN) 是一个JSON格式的规范
之前学过的认证方案: session的认证方案
特点: 非常轻巧
使用jwt替代session的原因:
session是基于cookie的,所以在android和ios中,并不通用。为了统一前端认证方案,使用jwt。
备注:
我们一般说的jwt指的是jws。
JWT的通讯流程
JWS
jws是一个jwt的一种实现方式。
数据格式:
header.payload.signature
1.header(头部):头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。
2.payload(载荷): 可以简单的理解为我们自己要传输的数据
3.signature(签名)
备注:
1.JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。
2.但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。
JWE
jwe是一个jwt的另外一种实现方式。
备注:
JWE的计算过程相对繁琐,不够轻量级,因此适合与数据传输而非token认证,但该协议也足够安全可靠,用简短字符串描述了传输内容,兼顾数据的安全性与完整性。
我们平时说的jwt一般还是指的是jws.
JWT刷新
pyjwt
生成token
import jwt
token = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
# 有时效的token
token = jwt.encode({'some': 'payload','exp':有效期的截止时间的时间戳}, 'secret', algorithm='HS256')
验证token
import jwt
jwt.decode(token, "secret")
# 如果验证失败,抛出异常jwt.PyJWTError
# 如果token中的payload中包含了exp字段,decode方法会同时检验是否过期
示例
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
JWT安全防护的机制