前言

  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. 异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)

    简介 CLRDBG_NOTIFICATION_EXCEPTION_CODE,值为0x0x04242420.此异常在.CLR 4.0的启动路径期间触发,是CLR4.0版本初始化调试服务时向调试器发送消息 ...

  2. map和object互转的几种方式

    1.使用Apache中的BeanUtils类,导入commons-beanutils包. 2.使用JSON 3.利用java.lang.reflect.Field类完成Obj和Map之间的相互转换 h ...

  3. 基环树DP

    基环树DP Page1:问题 啥是基环树?就是在一棵树上增加一条边. Page2:基环树的几种情况 无向 有向:基环外向树,基环内向树. Page3:处理问题的基本方式 1.断环成树 2.分别处理树和 ...

  4. centos git编译

    1. 下载git源码 https://git-scm.com 2. 根据文档一步步操作 https://git-scm.com/book/en/v2/Getting-Started-Installin ...

  5. pytest学习笔记二 fixtrue

    前言 官方文档关于fixture功能的解释如下: The purpose of test fixtures is to provide a fixed baseline upon which test ...

  6. windows下SVN使用 Add指令、Undo Add指令

    前几天,使用SVN的Add指令添加了一个文件,后不使用直接删除了,每次提交都存在,解决后记录方法,希望帮到大家,此外如果大家有好的方法,希望可以回复. 问题:使用Add添加文件后直接删除了文件,每次提 ...

  7. promise、async和await

    async:async function 声明将定义一个返回 AsyncFunction 对象的异步函数.当调用一个 async 函数时,会返回一个 Promise 对象.当这个 async 函数返回 ...

  8. cad.arx 自定义实体之编译第一个项目(甜头)

    本篇不从零开始讲如何制造自定义图元,而是教新手们如何设置了环境之后编译张帆书中的代码. 利用vs2010编译 张帆<AutoCAD ObjectARX(VC)开发基础与实例教程>一书中的自 ...

  9. Java8 流式 API(`java.util.stream`)

    熟悉 ES6 的开发者,肯定对数组的一些方法不是很陌生:map.filter 等.在对一组对象进行统一操作时,利用这些方法写出来的代码比常规的迭代代码更加的简练.在 C♯ 中,有 LINQ 来实现.那 ...

  10. CentOS7安装RabbitMQ,并设置远程访问

      如果网速慢 可以直接到百度云分享中下载,然后拉到centerOS中,进行第二步即可    两个人安装包地址,提取码:z1oz 1.安装erlang环境 wget http://www.rabbit ...