当前位置:   article > 正文

python 解析JWT实战_python jwt token无密钥解析

python jwt token无密钥解析
JWT:

JSON Web Token(JWT)是一个基于 RFC 7519 的开放数据标准,它定义了一种宽松且紧凑的数据组合方式,使用 JSON 对象在各应用之间传输加密信息。该 JSON 对象可以通过数字签名进行鉴签和校验,一般地,JWT 可以采用 HMAC 算法,RSA 或者 ECDSA 的公钥/私钥对数据进行签名操作。

一个 JWT 通常有 HEADER (头),PAYLOAD (有效载荷)和 SIGNATURE (签名)三个部分组成,三者之间使用“.”链接,格式如下:

头.有效载荷.签名
  • 1

下面是一个实例

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NzYxMzI1NTAsImlkIjoxLCJ1c2VybmFtZSI6ImFkbWluIn0.yORwdJrpC2YUyUxHNNZJ63bzdoNwajTK4W-OrIJ5HPI
  • 1

下面是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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

核心方法是jwt.decode,参数是jwt字符串和密钥
说明:

  • django的request获取请求头参数时,需要使用request.META,但是键名需要修改为HTTP_大写的请求头参数,比如 Auth -> HTTP_AUTH,获取cookie使用request.COOKIES,其是一个字典。
  • 要获得访问来源IP最好使用上方代码形式,因为对方可能使用代理,HTTP_X_FORWARDED_FOR是对方使用代理前的IP
  • 要生成JWT的话也可以使用此包,核心方法jwt.encode()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/893695
推荐阅读
相关标签
  

闽ICP备14008679号