• python+Django 下JWT的使用


    前言:

    JWT 是 json web token 的缩写, token的作用你应该已经了解,用于识别用户身份避免每次请求都需要验证

    用来解决前后端分离时的用户身份验证

    在传统的web项目中 我们会在form表单中设置隐藏字段来提交token信息

    但是在前后端分离时,我们就无法像网页一样直接放在表单里,

    需要前后端的配合才能完成token的验证

    简单使用:

    下面是使用itsdangerous模块实现JWT的生成与解析

     
     
     
    x
     
     
     
     
    import hashlib,time
    from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
    # 用一个值作为密钥 当然你可以用任何的字符串作为密钥 越复杂越安全
    secret_key = "548D859ADA8B084E76730CCEFA052EE1"
    # 除去密钥外 再添加一个盐值来提高安全性
    salt_str = "this is salt string"
    expires_in = 3600 # 控制token的有效时长 默认为3600秒
    # 实例化对应的对象传入两个参数,一个空的token就产生了,但是我们要用token来识别用户身份
    # 你当然可以把token和用户的身份信息存到数据库做对应
    # 但是jwt已经考虑到了,所以你只需要在dump中添加用于识别用户身份的数据即可
    # 后期当用户请求到达时,使用同样的方法反解就能获取到token中包含的数据
    # 从而完成用户身份的识别
    s = Serializer(secret_key=secret_key,expires_in=expires_in,salt=salt_str,)
    # 获取token并在其中写入用户的身份信息
    # s.dump() # 将token写入指定文件 与json的dump意思相同
    # 得到最后的token数据  分返回类型为字节 所以做一个解码
    # iat字段来自官方文档 用于表示token的过期时间,用于客户端做判断,不是必须的
    # 另外两个字段是自己定义的
    token = s.dumps({
        "uer_id":"100001",
        "role_id":"2",
        "iat":time.time(),
    }).decode("utf-8")
    # 得到token 在用户登录成功时返回给客户端
    print(token)
    # 客户端利用任何手段来存储token值,在请求数据时带上token一起请求
    # =======================================================================
    # 当客户端带上token来请求时我们需要从中获取用户的身份信息
    # 解析token时可能会发生异常,常见的如token过期,或token被篡改等等..
    # 服务器需要做相应的检查
     

    Django中使用案例:

    服务器端代码:

    文件:test/views.py

     
     
     
    xxxxxxxxxx
     
     
     
     
    from django.http import JsonResponse
    from test1 import jwt_tool
    # 登录接口
    def login(req):
        username = req.POST.get("username")
        password = req.POST.get("password")
        # 模拟登录
        if username == "jerry" and password == "123":
            # 用户标识id
            info = {"user_id":"10086"}
            #生成token
            token = jwt_tool.gen_token(info)
            # 返回数据
            data = {"msg":"登录成功!","token":token,"code":1}
            return JsonResponse(data, safe=False)
        else:
            return JsonResponse({"msg":"登录失败!","code":-1}, safe=False,)
          
    # 用于请求json数据的接口
    def get_some_data(req):
        try:
        # 获取token
            token = req.META["HTTP_TOKEN"]
            print(token)
        except:
            return JsonResponse({"msg": "缺少token!"}, safe=False)
        # 解析token获取用户身份信息
        res = jwt_tool.parser_token(token)
        if res["code"] == 1:
            user_id = res["data"]["user_id"]
            return JsonResponse({"msg": "您的id为:%s" % user_id,"data":"一些数据!"}, safe=False)
        else:
            return JsonResponse({"msg": "身份验证失败 请重新登录!"}, safe=False)
     

    客户端代码

    文件:client_test.py

     
     
     
    xxxxxxxxxx
     
     
     
     
    import requests
    # 模拟登录
    resp = requests.post("http://127.0.0.1:8000/login/",data={"username":"jerry","password":"123"})
    res = resp.json()
    # 取出返回的token
    token = None
    if res["code"] == 1:
        print("登录成功!")
        token = res["token"]
    else:
        print("登录失败!")
    # 请求数据接口
    resp1 = requests.get("http://127.0.0.1:8000/get_some_data/",headers={"token":token})
    print(resp1.json())
     

    源码:

    https://github.com/yangyuanhu/django-JWT.git

  • 相关阅读:
    [原创]java WEB学习笔记26:MVC案例完整实践(part 7)---修改的设计和实现
    [原创]java WEB学习笔记25:MVC案例完整实践(part 6)---新增操作的设计与实现
    [原创]java WEB学习笔记24:MVC案例完整实践(part 5)---删除操作的设计与实现
    [原创]java WEB学习笔记23:MVC案例完整实践(part 4)---模糊查询的设计与实现
    Tapestry IoC Configuration
    Tapestry IoC Decorator
    Tapestry IoC Service
    Tapestry-Again
    mysql error nr.1045 解决方法
    Bootstrap学习 导航
  • 原文地址:https://www.cnblogs.com/yangyuanhu/p/10780531.html
Copyright © 2020-2023  润新知