django-channels自定义中间件验证token的方法
测试版本:
python 3.8
djnago 3.2
channels 3.0
需求
在使用channels 建立websocket连接的时候,需要验证客户端的token,并保存一些关键信息
实现原理
使用自定义的中间件进行对token的验证,当然,前端需要把 token放在 headers里
实现步骤
1.创建一个中间件,用来验证token
项目目录下,新建一个 middleware 目录,内部创建一个 my_middleware.py 文件
# middleware/my_middleware.py
# 这是一个无需在settings中注册的中间件
import jwt
class WsTokenVerify:
"""
websocket 使用的 token解析中间件
"""
def __init__(self, app):
# Store the ASGI application we were passed
self.app = app
async def __call__(self, scope, receive, send):
headers = scope['headers']
# headers 里面是一个个的元组类似于[(b'User-Agent',b'XXXX'),(b'token',b'XXXXX'),……]
# 从headers中取出token
for k, v in headers:
if k.decode() == 'token':
token = v.decode()
break
# 解析 token
try:
jwt_dict = jwt.decode(token, key=settings.TOKEN_KEY)
except Exception as e:
# 解析失败,则不做任何处理,直接交给视图函数,视图函数会尝试从scope中取出关键信息,失败则会断开websocket连接
return await self.app(scope, receive, send)
# 将客户端的唯一身份标识(关键信息)加入scope
scope['uid'] = jwt_dict['uid']
scope['nickname'] = jwt_dict['nickname']
scope['group_name'] = jwt_dict['group_name']
return await self.app(scope, receive, send)
2.然后改写: 项目目录/项目同名目录/asgi.py文件
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack # django 自带用户身份认证
from middleware.my_middleware import WsTokenVerify # 自己写的用户身份认证
from gps.urls import websocket_urlpatterns # 自定义的路由
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'qixing_app.settings')
django_application = get_asgi_application()
application = ProtocolTypeRouter({
"http": get_asgi_application(),
# 这里需要更改官网示例,将AuthMiddlewareStack改为我们刚才自定义的中间件
"websocket": WsTokenVerify(URLRouter(websocket_urlpatterns))
})
3.编写视图函数(建立连接部分)
class Connect(AsyncWebsocketConsumer):
async def connect(self):
try:
self.uid = self.scope['uid']
self.nickname = self.scope['nickname']
self.room_group_name = f"channel_{self.scope['group_name']}"
except Exception as e:
# 关键信息获取失败,则断开连接
print("拒绝连接", e)
await self.close()
else:
# Join room group
await self.channel_layer.group_add(self.room_group_name, self.channel_name)
print('建立连接')
await self.accept()
django-channels自定义中间件验证token的方法的更多相关文章
- django实现自定义登陆验证
django实现自定义登陆验证 自定义装饰器函数和类 from utils.http import HttpResponseUnauthorized from django.views import ...
- django系列8.1--django的中间件01 自定义中间件的5个方法
一.Django中的中间件 Django中间件定义: Middleware is a framework of hooks into Django's request/response process ...
- Django 之 自定义中间件
环境:django:1.10 python: 2.7 简介 中间件是一个轻量级.底层的插件系统,可以介入 django 的请求和响应处理过程,修改 django 的输入和输出. 在 django ...
- 什么是django中间件?(七个中间件-自定义中间件)
目录 一:django中间件 1.什么是django中间件 2.django请求生命周期流程图 二:django自带七个中间件 1.研究django中间件代码规律 2.django支持程序员自定义中间 ...
- Django之Middleware中间件方法使用
自定义中间件五个方法(部分方法)实例 自定义中间件项目: 模板Templates login.html {% load static %} <!DOCTYPE html> <html ...
- Django之组件--中间件
中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性能 自定义中间 ...
- Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)
一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...
- (28)django的中间件(自定义中间件和防范跨站请求伪造攻击)-重要的概念
Django中间件和中间件不是同一种东西 什么是中间件:中间件是一个很大的概念,只要程序和程序之间还有一层程序,用来处理两个程序的整个交互过程的请求.数据等等就叫中间件 Django中间件:是介于re ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- asp.net core 3.1 自定义中间件实现jwt token认证
asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...
随机推荐
- Wifi - 查看连接过的Wifi的密码
使用管理员身份打开命令提示符 Microsoft Windows [版本 10.0.22621.1702] (c) Microsoft Corporation.保留所有权利. C:\Windows\S ...
- JAVA实现AES加密、解密
一.什么是AES? 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用. ...
- 使用 SK 进行向量操作
先祝大家 2025 新年好. 在 2024 年落地的 LLM 应用来看,基本上都是结合 RAG 技术来使用的.因为绝大多数人跟公司是没有 fine-turning 的能力的.不管是在难度还是成本的角度 ...
- Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
一:背景 1. 讲故事 前面跟大家分享过一篇 C# 调用 C代码引发非托管内存泄露 的文章,这是一个故意引发的正向泄露,这一篇我们从逆向的角度去洞察引发泄露的祸根代码,这东西如果在 windows 上 ...
- 关于centos 7安装binwalk的过程中产生的问题
啊,kali机坏了,又安的centos o(╥﹏╥)o 但是centos没有binwalk,它也不能像kali机一样之间install 又在网上搜教程 https://blog.csdn.net/qq ...
- eslint-plugin-vue配置中文翻译
eslint-plugin-vue配置中文翻译 由于 ellint 配置太多,很多小伙伴不知道其功能是什么,在此做个记录. //更详细的配置文档请参考:https://github.com/vuejs ...
- selinux中Enforcing, Permissive 和Disable这三种模式的区别
1.如果要马上拒绝运行SELinux:[root@localhost ~]# setenforce 0[root@localhost ~]# getenforcePermissive这条命令会把SEL ...
- 【Pandas】concat方法使用注意点
使用pandas库的concat做数据拼接需要注意,应该先对原始数据设置列名,如果没有设置列名,在拼接时只会保留第一个文件的第一行(以列名形式),由于剩下的文件在读取时会自动将第一行作为列名,这样就会 ...
- 【Python】Python环境安装与简单代码运行
Python环境安装与简单代码运行 视频教程链接:https://www.bilibili.com/video/BV1KG4y1t7dM/ 一.配置Python环境 1.下载Python安装包 建议使 ...
- php代码审计实战-开源项目Materialized CMS漏洞检测
一.下载Materialized CMS 链接地址:https://sourceforge.net/projects/materialized-cms/files/latest/download 二. ...