python 解析JWT实战

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()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值