ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python+Django 下JWT的使用

2019-04-27 21:53:16  阅读:489  来源: 互联网

标签:md cm python JWT inherit Django color background 0px


<style></style>

 

前言:

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

 

 

标签:md,cm,python,JWT,inherit,Django,color,background,0px
来源: https://www.cnblogs.com/yangyuanhu/p/10780531.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有