使用令牌身份验证时如何在Django通道中的Websocket连接中对用户进行身份验证

罗宾

在我的项目中使用REST API的前端框架(Vuejs)和django-rest-framework另外,对于JSON Web令牌身份验证,我正在使用django-rest-framework-jwt成功登录后,将为用户提供令牌。此令牌传递到每个请求中,以获取与API相关的所有内容。

现在,我想将Django频道集成到我的项目中。因此,成功登录后,当在客户端收到令牌时,我想启动一个websocket连接。然后在服务器(消费者)上,我想检查所请求的用户是否不是匿名的。如果请求的用户是匿名用户,我想关闭连接或接受它。

这是我到目前为止的方法:

客户端:

const socket = new WebSocket("ws://" + "dev.site.com"+ "/chat/");

routing.py:

channel_routing = [
    route("websocket.connect", ws_connect),
    ...
    ...
]

消费者:

def ws_connect(message):

    # if the user is no anonymous
    message.reply_channel.send({
        "accept": True
    })

    # else
    message.reply_channel.send({
        "close": True
    })

文档中有一个装饰器@channel_session_user_from_http,它将提供一个message.user但是我使用令牌而不是会话。使用令牌身份验证时,如何检查用户的连接,以便我可以接受或关闭连接。或者,如果有更好的方法,请告诉我。谢谢。

马蹄铁

问题在于浏览器不支持在websocket升级中传递jwt auth标头,基本上就是这样。我前段时间遇到了这个问题,并提出了通过查询参数传递令牌的解决方案-请注意,在TLS中公开身份验证时,如果没有TLS这是完全不安全的。我无法再访问确切的代码,但是这里有个主意:

from channels.generic.websockets import JsonWebsocketConsumer
from channels.handler import AsgiRequest

from rest_framework_jwt.serializers import VerifyJSONWebTokenSerializer
from jwt.exceptions import InvalidTokenError
from rest_framework.exceptions import ValidationError

class Consumer(JsonWebsocketConsumer):

    def connect(self, message, **kwargs):
        # construct a fake http-like request object from the message
        message.content.setdefault('method', 'FAKE')
        request = AsgiRequest(message)
        # validate the token
        try:
            VerifyJSONWebTokenSerializer().validate(request.GET)
            super().connect(message, **kwargs)
        except (KeyError, InvalidTokenError, ValidationError,):
            # token is either not available or invalid
            # so we disconnect the user
            message.reply_channel.send({'close': True})

向消费者注册

channel_routing = [
    ...
    route_class(Consumer, path=r'^my-ws-endpoint$'),
]

在浏览器端,您可以通过在Websocket URI中将令牌作为查询参数传递来建立Websocket连接:

let token: string = 'my-token'; // get the token
let wsHandler: $WebSocket = new $WebSocket('wss://example.com/my-ws-endpoint/?token=' + token, ...);

然后,您可以在类似于装饰器的装饰器中提取auth检查代码,@channel_session_user_from_http并仅装饰您的连接例程;如果使用基于类的路由,则可以将代码提取到mixin。

我想重复一遍,尽管这种方法在不使用加密的情况下是完全不安全的,所以在生产中,URI应该以开头https/wss


编辑:这是DRF令牌身份验证的不错的解决方案,适用于基于函数和基于类的路由。它具有与我的方法几乎相同的方法,即构造一个请求对象并将其传递给身份验证器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Django频道上使用令牌身份验证对Websocket进行身份验证?

使用用户实体进行身份验证时如何在Symfony 4中使用独立的基本身份验证

使用外部身份验证源时如何在Spring Boot中模拟身份验证

[Authorize]属性如何知道用户在ASP.NET MVC中已通过身份验证令牌进行身份验证?

在Web应用程序中对用户进行身份验证时,对用户进行身份验证以使用Azure功能

django中的令牌/会话身份验证

如何在Web API中获取经过身份验证的用户名(基于令牌的身份验证)

如何在Web API中启用Windows身份验证和Owin令牌身份验证?

在 PHP 中与 PayPal 连接以进行用户身份验证

仅当状态为活动时,如何在Laravel 8 Jetstream中对用户进行身份验证?

如何使用 GameCenter Firebase 身份验证在 Unity 中访问身份验证令牌

在Rails中通过SAML对用户进行身份验证时,如何发送经过身份验证的响应?

如何在Google的“操作”中仅使用Google帐户对用户进行身份验证?

如何在Rails 4中使用Omniauth-facebook对用户进行身份验证

在Django中重置密码后对用户进行身份验证

如何在api调用中使用令牌对用户进行身份验证?

如何在Spring Security中关闭Websocket的身份验证?

如何在AWS中对Facebook用户进行身份验证亚马逊身份池ID

如何使用 HTTR 在 R 中自动进行 YouTube OAuth 身份验证/重新身份验证

如何在没有Windows身份验证的情况下使用Active Directory用户在SQL SERVER 2008中进行身份验证

在Django Rest Framework中使用令牌身份验证进行身份验证时,不会更新last_login字段

如何在phoenix中实现用户身份验证

如何在Android中检查电话身份验证用户?

如何在Golang中检索经过身份验证的用户

如何在Firebase中管理用户的不同身份验证

如何在部署组注册脚本中显示“用户身份验证令牌”复选框

在IIS HTTP PlatformHandler前面使用Windows身份验证时,如何在Python中获取经过身份验证的用户名?

向JSON REST API进行身份验证时如何获取会话令牌(在R中)

如何在angular 2中进行身份验证