开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了。我们认为这样的经验是有必要记录下来的,因此就有了【技术博客】。

# JWT的认证机制Django项目中应用

这篇技术博客基于软件工程课程的VisualPytorch之上。本文小部分参考了https://jwt.io/introduction/

前言-JWT是什么,为什么用JWT

在做绝大部分数据库系统时(网站、小程序),登录注册肯定是一个绕不开的功能。一般来说传统的解决方案是基于session机制的认证,也就是客户端发送用户名密码给服务器,服务器端验证后创建一个session,把session的id返回客户端,客户端每次请求时带着session的id以此作为验证。

从我的视角来看主要存在两个问题:

(1) 给服务器压力大

session一般保存在内存中,当然比较大的应用保存在Redis这类数据库中,通过session_id来做认证增加了访存次数,影响性能。

(2) 单点登录的问题

如果你的应用需要支持通过微信号、QQ号登录,session_id的方式显然很成问题,毕竟你不可能拿到腾讯的数据库里的内容。

这里就考虑了使用JWT机制来进行认证。JWT全称是JSON WEB TOKEN,如果使用JWT进行认证,服务器端不需要保存信息,因为JWT将信息加密到了token里。用户只需要每次请求的时候带着token即可,服务器会自己解密。

需要补充的一点是,JWT和session机制并不冲突,如果你的应用对于session有需求,可以使用JWT做认证,session做其他需求。

如果想比较详细地了解JWT,可以参考RFC7519

Django中JWT解决方案

有一个基于Django Restful接口的包可以用

pip install djangorestframework-jwt

详细使用方法参照官方文档

该中间件主要提供了三个接口

#获得token
from rest_framework_jwt.views import obtain_jwt_token
#刷新token
from rest_framework_jwt.views import refresh_jwt_token
#验证token
from rest_framework_jwt.views import verify_jwt_token

登录时调用obtain_jwt_token即可。

而对于需要验证用户权限的接口,需要在settings.py中添加

 'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
]

随后在接口层中增加需要的权限即可自动利用jwt来验证(不需要调用上文提到的verify_jwt_token),例如

permission_classes = (permissions.IsAuthenticated,)

如何修改验证登录方式

这个其实和JWT无关,和Django有关,但既然都是一个项目下的,不妨多写一下,以防有需求。

方法重写Django中User的的后端类中的authenticate方法,并且在settings.py中添加

AUTHENTICATION_BACKENDS = [
'user.utils.UserAuthBackend', # 修改auth认证后端类,这里要写你自己新写的验证类
]

我重写验证方法的代码如下,仅供参考

from django.contrib.auth.backends import ModelBackend
from .models import User
from django.db.models import Q class UserAuthBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): # 邮箱或用户名登录
try:
user = User.objects.get(Q(username=username) | Q(email=username))
except User.DoesNotExist:
return None
else:
if user.check_password(password) and self.user_can_authenticate(user):
return user

关与token有效时间与刷新

这个中间价的默认设置一个token有效时间为300s,token与其子孙token的过期时间为7天。

也就是说每隔300s都必须刷新当前的token,而隔7天的话刷新也无用必须重新获取。

需要更改设置可以参考官方文档。

【技术博客】JWT的认证机制Django项目中应用的更多相关文章

  1. [技术博客]阿里云签名机制字符串的C语言实现

    [技术博客]阿里云签名机制字符串的C语言实现 问题描述见:阿里云签名机制 话不多说,上字符串函数转化函数代码 bool AlicloudRequest::sendV2Request() { if( q ...

  2. [技术博客] 用户验证码验证机制---redis缓存数据库的使用

    目录 问题引入 初识redis 实际应用 作者:马振亚 问题引入 在这次的开发过程中,我们的需求中有一个是普通用户可以通过特定的机制申请成为社长.因为只有部分人才能验证成功,所以这个最开始想了两种思路 ...

  3. 【技术博客】Django中文件下载的实现

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. Django中文件下载的实现 1.背景 在VisualPy ...

  4. [技术博客] Django中文件的保存与访问

    [技术博客] Django中文件的保存与访问 在TextMarking项目开发中,数据库需要保存用户上传的文本文档. 原型设计:用户点击上传文本->保存文本->文本发送到后端保存为文件. ...

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

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

  6. [技术博客]使用pylint实现django项目的代码风格检查

    使用pylint实现django项目的代码风格检查 前言 ​ 一个项目大多都是由一个团队来完成,如果没有统一的代码规范,那么每个人的代码的风格必定会有很大的差别.且不说会存在多个人同时开发同一模块的情 ...

  7. ******IT公司面试题汇总+优秀技术博客汇总

    滴滴面试题:滴滴打车数据库如何拆分 前端时间去滴滴面试,有一道题目是这样的,滴滴每天有100万的订单,如果让你去设计数据库,你会怎么去设计? 当时我的想法是根据用户id的最后一位对某个特殊的值取%操作 ...

  8. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  9. [转]有哪些值得关注的技术博客(Java篇)

    有哪些值得关注的技术博客(Java篇)   大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...

随机推荐

  1. NodeJS新建服务器以及CommonJS规范

    1.什么是node.js?(1)Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.( ...

  2. CENTOS7-JAVA模拟CPU占用高及排查( 转)

    环境 centos7 1核2GB Java8 模拟cpu占用高 新建一个名为jvm-learn的springboot项目 模拟代码如下 import org.springframework.boot. ...

  3. psexec与wmi在内网渗透的使用

    psexec是一个很好的管理工具,在内网渗透中也被广泛使用. 但太“出名”也往往会遭来各种麻烦. 在有安全监听.防护的内网中使用psexec会容易触发告警. 1.psexec用法(前提:对方要开启ad ...

  4. 文章中左下角的妹子live2d看板娘

    关键词: live2d看板娘 自行搜索即可 攻略很多

  5. 排序算法的c++实现——归并排序

    归并排序是典型分治思想的代表——首先把原问题分解为两个或多个子问题,然后求解子问题的解,最后使用子问题的解来构造出原问题的解. 对于归并排序,给定一个待排序的数组,首先把该数组划分为两个子数组,然后对 ...

  6. Java变量常量声明和定义

    一.常量和变量 1.常量变量定义 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 2 ...

  7. Odoo CRM模块

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10825983.html  一:理解CRM CRM:客户关系管理,是指企业用CRM技术来管理与客户之间的关系. ...

  8. Httpd服务进阶知识-HTTP协议详解

    Httpd服务进阶知识-HTTP协议详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.WEB开发概述 1>.C/S编程 CS即客户端.服务器编程. 客户端.服务端之间需 ...

  9. Beta产品测试报告:那周余嘉熊掌将得队、为了交项目干杯队

    测试对象: 那周余嘉熊掌将得队 一.截图 安装截图 运行截图 二.测试情况 1.第一次上手体验感觉如何?能否正常运行? 界面UI设计令人眼前一亮,客户端和管理员端皆可正常运行.组件动画流畅,响应流畅, ...

  10. Python基础知识笔记-作用域

    Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的. 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作用域一共有4种,分别是: ...