1.jwt的定义和作用
JSON Web Token (JWT) 是一个非常轻巧的规范,常见的两种jwt
- jws (JSON Web Signature) 轻量级,适合token认证
- jwe (SON Web Encryption) 相对繁琐,适合数据传输
作用:
- 解决跨域认证
- 解决csrf跨域问题
2.jwt工作原理
- 用户以 Web表单 的形式,将自己的用户名和密码 POST 到后端的接口。
- 后端核对用户名和密码成功后,会计算生成JWT Payload 字符串,然后返回 response 给浏览器。
- 浏览器收到 JWT 后,将其保存在 cookie里
- 后续在该域上发出的请求,都会将 JWT放入HTTP Header 中的 Authorization 字段。
- 后端收到新请求后,会使用密钥验证 JWT 签名。
- 验证通过后后端使用 JWT 中包含的用户信息进行其他相关操作,返回相应结果。
3. jwt的组成
-
头部(Header)
-
载荷(Payload)
-
签名(Signature)
头部(Header)
- typ:声明类型这里是 JWT
- alg:声明加密的算法通常直接使用 HMAC SHA256
载荷(Payload)
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
签名(Signature)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
4.如何生成jwt
import jwt
import datetime
import uuid
salt = 'minggezuishuai'
# 构造header , 这里不写默认的也是
headers = {
'typ': 'JWT',
'alg': 'HS256'
}
# 构造payload
payload = {
'user_id': str(uuid.uuid4()), # 自定义用户ID
'username': "wangbm", # 自定义用户名
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=5) # 超时时间,取现在时间,五分钟后token失效
}
5.jwt如何存储
将jwt存储在cookie中不开启HttpOnly,通过请求的Header进行传输,任然存在xss攻击,通过校验参数避免xss攻击
6.jwt如何发送
将JWT放在Header里的Authorization
字段,并使用 Bearer
标注
'Authorization': 'Bearer ' + ${token}
from flask import request, g
from .jwt_util import verify_jwt
def jwt_authentication():
"""
根据jwt验证用户身份
"""
g.user_id = None
g.is_refresh_token = False
authorization = request.headers.get('Authorization')
if authorization and authorization.startswith('Bearer '):
token = authorization.strip()[7:]
payload = verify_jwt(token)
if payload:
g.user_id = payload.get('user_id')
g.is_refresh_token = payload.get('refresh')
7.jwt如何校验
def verify_jwt(token, secret=None):
"""
检验jwt
:param token: jwt
:param secret: 密钥
:return: dict: payload
"""
try:
payload = jwt.decode(token, secret, algorithm=['HS256'])
except jwt.PyJWTError:
payload = None
return payload
8.jwt最佳搭档
JWT最好与HTTPS 配合使用,利用 HTTPS 的非对称加密来保证 JWT 的安全