JWT:
JSON Web Token(JWT)是一个基于 RFC 7519 的开放数据标准,它定义了一种宽松且紧凑的数据组合方式,使用 JSON 对象在各应用之间传输加密信息。该 JSON 对象可以通过数字签名进行鉴签和校验,一般地,JWT 可以采用 HMAC 算法,RSA 或者 ECDSA 的公钥/私钥对数据进行签名操作。
一个 JWT 通常有 HEADER (头),PAYLOAD (有效载荷)和 SIGNATURE (签名)三个部分组成,三者之间使用“.”链接,格式如下:
头.有效载荷.签名
下面是一个实例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NzYxMzI1NTAsImlkIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.yORwdJrpC2YUyUxHNNZJ63bzdoNwajTK4W-OrIJ5HPI
下面是Django解析JWT的一个实例
注意下载的包是PyJWT,不是jwt
import logging
import time
from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin
import jwt
from dataProject.settings import *
##检查JWT
def checkJWT(req, jwtstr):
##解码
data = jwt.decode(jwtstr, JWT_SECURE_KEY)
##是否是admin
try:
assert data.get('username1', None) == 'admin'
###判断token是否过期
if int(time.time()) - data['iat'] > JWT_TIMEOUT:
return JsonResponse({"responseStatus": {"status": 401, "message": 'Bad Request'}}, status=401)
except AssertionError as e:
logging.error('Bad Request from {}'.format(
req.META.get('HTTP_X_FORWARDED_FOR', None) or req.META.get('REMOTE_ADDR', None)))
return JsonResponse({"responseStatus": {"status": 401, "message": 'Bad Request'}}, status=401)
class check_jwt_before_view(MiddlewareMixin):
def process_request(self, req):
try:
JsonWebToken = req.COOKIES['Admin-Token']
except KeyError as e:
return JsonResponse({"responseStatus": {"status": 401, "message": 'Bad Request'}}, status=401)
##检查JWT
checkJWT(req, JsonWebToken)
核心方法是jwt.decode,参数是jwt字符串和密钥
说明:
- django的request获取请求头参数时,需要使用request.META,但是键名需要修改为HTTP_大写的请求头参数,比如 Auth -> HTTP_AUTH,获取cookie使用request.COOKIES,其是一个字典。
- 要获得访问来源IP最好使用上方代码形式,因为对方可能使用代理,HTTP_X_FORWARDED_FOR是对方使用代理前的IP
- 要生成JWT的话也可以使用此包,核心方法jwt.encode()