测试版本:

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的方法的更多相关文章

  1. django实现自定义登陆验证

    django实现自定义登陆验证 自定义装饰器函数和类 from utils.http import HttpResponseUnauthorized from django.views import ...

  2. django系列8.1--django的中间件01 自定义中间件的5个方法

    一.Django中的中间件 Django中间件定义: Middleware is a framework of hooks into Django's request/response process ...

  3. Django 之 自定义中间件

    环境:django:1.10    python: 2.7 简介 中间件是一个轻量级.底层的插件系统,可以介入 django 的请求和响应处理过程,修改 django 的输入和输出. 在 django ...

  4. 什么是django中间件?(七个中间件-自定义中间件)

    目录 一:django中间件 1.什么是django中间件 2.django请求生命周期流程图 二:django自带七个中间件 1.研究django中间件代码规律 2.django支持程序员自定义中间 ...

  5. Django之Middleware中间件方法使用

    自定义中间件五个方法(部分方法)实例 自定义中间件项目: 模板Templates login.html {% load static %} <!DOCTYPE html> <html ...

  6. Django之组件--中间件

    中间件 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性能 自定义中间 ...

  7. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)

    一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...

  8. (28)django的中间件(自定义中间件和防范跨站请求伪造攻击)-重要的概念

    Django中间件和中间件不是同一种东西 什么是中间件:中间件是一个很大的概念,只要程序和程序之间还有一层程序,用来处理两个程序的整个交互过程的请求.数据等等就叫中间件 Django中间件:是介于re ...

  9. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  10. asp.net core 3.1 自定义中间件实现jwt token认证

    asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...

随机推荐

  1. Wifi - 查看连接过的Wifi的密码

    使用管理员身份打开命令提示符 Microsoft Windows [版本 10.0.22621.1702] (c) Microsoft Corporation.保留所有权利. C:\Windows\S ...

  2. JAVA实现AES加密、解密

    一.什么是AES? 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用. ...

  3. 使用 SK 进行向量操作

    先祝大家 2025 新年好. 在 2024 年落地的 LLM 应用来看,基本上都是结合 RAG 技术来使用的.因为绝大多数人跟公司是没有 fine-turning 的能力的.不管是在难度还是成本的角度 ...

  4. Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露

    一:背景 1. 讲故事 前面跟大家分享过一篇 C# 调用 C代码引发非托管内存泄露 的文章,这是一个故意引发的正向泄露,这一篇我们从逆向的角度去洞察引发泄露的祸根代码,这东西如果在 windows 上 ...

  5. 关于centos 7安装binwalk的过程中产生的问题

    啊,kali机坏了,又安的centos o(╥﹏╥)o 但是centos没有binwalk,它也不能像kali机一样之间install 又在网上搜教程 https://blog.csdn.net/qq ...

  6. eslint-plugin-vue配置中文翻译

    eslint-plugin-vue配置中文翻译 由于 ellint 配置太多,很多小伙伴不知道其功能是什么,在此做个记录. //更详细的配置文档请参考:https://github.com/vuejs ...

  7. selinux中Enforcing, Permissive 和Disable这三种模式的区别

    1.如果要马上拒绝运行SELinux:[root@localhost ~]# setenforce 0[root@localhost ~]# getenforcePermissive这条命令会把SEL ...

  8. 【Pandas】concat方法使用注意点

    使用pandas库的concat做数据拼接需要注意,应该先对原始数据设置列名,如果没有设置列名,在拼接时只会保留第一个文件的第一行(以列名形式),由于剩下的文件在读取时会自动将第一行作为列名,这样就会 ...

  9. 【Python】Python环境安装与简单代码运行

    Python环境安装与简单代码运行 视频教程链接:https://www.bilibili.com/video/BV1KG4y1t7dM/ 一.配置Python环境 1.下载Python安装包 建议使 ...

  10. php代码审计实战-开源项目Materialized CMS漏洞检测

    一.下载Materialized CMS 链接地址:https://sourceforge.net/projects/materialized-cms/files/latest/download 二. ...