前言

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

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

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

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

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

简单使用:

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

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被篡改等等..
# 服务器需要做相应的检查
 
代码实现
服务器端代码:

文件:test/views.py

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 == "":
# 用户标识id
info = {"user_id":""}
#生成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 import requests

# 模拟登录
resp = requests.post("http://127.0.0.1:8000/login/",data={"username":"jerry","password":""})
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())

Django下JWT的使用的更多相关文章

  1. python+Django 下JWT的使用

    figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...

  2. django下的ckeditor 5.0 文本编辑器上传功能。

    完整的后台界面怎么可以没有文本编辑器,但是django的admin界面很疑惑,没有自带文本编辑器,好在网上有不少成型的库可以用 我用的是ckeditor编辑器,安装和配置我引用别人的博客 这篇博客配置 ...

  3. django下进行项目的部署

    -------------------Django下进行对应的服务器配置1.服务器购买 本人在阿里云购买了一个服务器,操作系统为windows server2008/Linux(ubuntu) 2.服 ...

  4. django restframework jwt

    既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...

  5. Python学习---django下的cookie操作 180201

    什么是Cookies 什么是Cookies cookies设置的原因: 1. http请求的无记忆性: 2.加快访问速度  3. 减少服务器压力 cookies特点: cookies保存在客户端浏览器 ...

  6. django下的csrf防御机制

    CSRF 1.什么是CSRF? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写 ...

  7. Django下MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL解惑

    Django中settings中的四个设置参数的一些故事: MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL 1.MEDIA_ROOT与MEDIA_URL ...

  8. Django基于JWT实现微信小程序的登录和鉴权

    什么是JWT? JWT,全称Json Web Token,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它是数字签名的. 与Session的区别 一.Session是在服务 ...

  9. [Django]下拉表单与模型查询

    前言:本文主要针对自定义下拉表单制作,下拉表单的内容是取至于数据库,即动态实现下拉表单 正文: 动态实现下拉表单有两种方法: 一.自己手动写 html 模板中的 <form ...> &l ...

随机推荐

  1. datatime模块的使用

    dt_now = datetime.datetime.now()print(dt_now)# 2019-05-09 14:44:32.555337 获取日期,不含时分秒today = dt_now.d ...

  2. 洛谷p3916图的遍历题解

    题面 思路: 反向建边,dfs艹咋想出来的啊 倒着遍历,如果你现在遍历到的这个点已经被标记了祖先是谁了 那么就continue掉 因为如果被标记了就说明前面已经遍历过了 而我们的顺序倒着来的 前边的一 ...

  3. Beta/Gamma事后分析

    目录 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 对照敏捷开发的原则, 你觉得你们小组做得最好的是哪几个原则? 请列出具体的事例. 照片 设想和目标 我们的 ...

  4. [技术博客]ubuntu+nginx+uwsgi+Django+https的部署

    ubuntu+nginx+uwsgi+Django+https部署文档 配置机器介绍 操作系统:Ubuntu 18.04.2 LTS 64位 python版本:Python 3.6.7 Django版 ...

  5. Gamma阶段第十次scrum meeting

    每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...

  6. shell(一) shell变量

    基本介绍 变量命名规范 变量名要求由字母.数字.下划线组成,尽量字母开头,有明确含义 注意:变量赋值时,等号前后不能有空格,变量名称不能和字体变量冲突 自定义变量 当前shell有效 1.定义变量 v ...

  7. excel绘制多列 其中一列作为横坐标 ; 数值拟合

    excel绘制多列,其中最左列作为横纵坐标: 选中很多列,然后,,点击菜单栏的“插入”->“图标” -->在弹出的“插入图表”对话框中选择“X Y(散点图)”,默认是条形图.  左边的列会 ...

  8. ES6中的关键字 - let

    let关键字 1.let关键字声明的变量仅仅在自己的块级作用域内起作用,出了块级作用域就不起作用了: var arr2 = []; for (let index = 0; index < 10; ...

  9. Java注解及其原理以及分析spring注解解析源码

    注解的定义 注解是那些插入到源代码中,使用其他工具可以对其进行处理的标签. 注解不会改变程序的编译方式:Java编译器对于包含注解和不包含注解的代码会生成相同的虚拟机指令. 在Java中,注解是被当做 ...

  10. 027 ElasticSearch----全文检索技术02---快速入门

    1.基本概念 Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的. 注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,E ...