django websocket jwt 认证

 适用于django1 -django2  

django3可以参考:django3 channels 认证

在项目中想在websocket中加入认证

我是把 JWTtoken 加到了url 后面 ?之后 例如

var socket = new WebSocket('ws://'+window.location.host +'/wx/role/2/?eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjozOCwidXNlcm5hbWUiOiJobGx5em1zIiwiZXhwIjoxNTkwMjEyMDc1LCJlbWFpbCI6ImhAMTIzLmNvbSJ9.Zrh07IUmk5nJ3hXFHnNac6t5ai4Z7e2hQWS4WFpgLVI');
   

自己写的认证 ws_authentication.py

from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser
from django.db import close_old_connections
from rest_framework_jwt.authentication import jwt_decode_handler


class QueryAuthMiddleware:

    def __init__(self, inner):

        self.inner = inner

    def __call__(self, scope):

        close_old_connections()

        # User = get_user_model()
        # user = User.objects.first()
        
        token = scope["query_string"]
        print(token)
        token = token.decode("utf-8")
        user = AnonymousUser()
        if token:
            user = authenticate(token)
        print("*****")
        return self.inner(dict(scope, user=user))


def authenticate(jwt_value):
    try:
        payload = jwt_decode_handler(jwt_value)
    except Exception:
        user = AnonymousUser()
        print("-----------")
        return user

    user = authenticate_credentials(payload)

    return user


def authenticate_credentials(payload):
    username = payload.get('username')
    try:
        User = get_user_model()
        user = User.objects.get(username=username)
    except Exception:
        user= AnonymousUser()
    return user

使用上面的认证


from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter, ChannelNameRouter
from django.contrib.auth.models import AnonymousUser

import users.routing
from users import consumers
from .ws_authentication import QueryAuthMiddleware

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': QueryAuthMiddleware(
        URLRouter(
            users.routing.websocket_urlpatterns
        )
    ),
    "channel": ChannelNameRouter({
        "service-detection": consumers.ServiceConsumer,
    }),
})

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值