博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django下JWT的使用
阅读量:4959 次
发布时间:2019-06-12

本文共 2780 字,大约阅读时间需要 9 分钟。

前言

  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.pyfrom django.http import JsonResponsefrom 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 import requests​# 模拟登录resp = requests.post("http://127.0.0.1:8000/login/",data={
"username":"jerry","password":"123"})res = resp.json()​# 取出返回的tokentoken = Noneif 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://www.cnblogs.com/qlshao/p/11149066.html

你可能感兴趣的文章
数据结构学习记录_2019.02.23
查看>>
使用Android Studio来阅读Android源码
查看>>
java 实现word文档在线预览
查看>>
CTSC/APIO2018 帝都一周游
查看>>
如何实现数据库实体生成工具
查看>>
中兴2018届应届生在线编程测验0829 数学家排成平行四边形问题
查看>>
java中的全局变量如何实现?ThreadLocal~
查看>>
MQ异步同步搜索引擎ElasticSearch数据踩坑
查看>>
CPUID
查看>>
页码数求0到9共有多少个
查看>>
通过编码设定 ObjectDataSource 参数值6
查看>>
Json格式获取接口返回的值
查看>>
AppCan认为,移动APP开发不是技术活
查看>>
curl
查看>>
协同过滤算法
查看>>
矩阵快速幂 模板
查看>>
[MySQL] AUTO_INCREMENT lock Handing in InnoDB
查看>>
动手动脑
查看>>
创建图像映射
查看>>
Django后端向前端直接传html语言防止转义的方法(2种)
查看>>