Skip to main content

django-channels-jwt-auth-middleware

Custom AuthMiddlewareStack to get users from JWT token for Django Channels.

Installation

Simply,

$ pip install django-channels-jwt-auth-middleware

And that it.

Usage

All you have to do is wrap your URLRouter.

from django_channels_jwt_auth_middleware.auth import JWTAuthMiddlewareStack

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": JWTAuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns,
        )
    ),
})

AuthMiddlewareStack is already in JWTAuthMiddlewareStack. If you want to change this, simply do;

from django_channels_jwt_auth_middleware.auth import JWTAuthMiddleware

from . import YourCustomMiddlewareStack

def CustomJWTAuthMiddlewareStack(app):
    return JWTAuthMiddleware(YourCustomMiddlewareStack(app))

Simply as that :)

Testing

Testing is done by two methods.

  1. automated testing using django's test system.
  2. manual testing by hand.

I have tried testing the middleware through ChannelsLiveServerTestCase, but currently this does not run due to pickle error in multiprocessing package from python.
For this reason no-token test cases were tested using django's test system using a test project, and test cases with jwt token is tested by hand.
Hand testing chrome extension called Browser WebSocket Client was used. B low is a simple evidence from the hand testing.

websocket_connection_with_jwt_token

websocket_connection_with_token_query_param_without_value

websocket_connection_without_token

If you go to testproject/pages/tests.py you will see the consumer that is used for testing.

class TestConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()

    # def disconnect(self, code):
    #     self.disconnect()

    def receive(self, text_data, bytes_data=None):
        context = {
            'message': 'testing consumer',
        }
        user = self.scope['user']
        if (user_id := user.id):
            context.update({'user': str(user_id)})
        else:
            context.update({'user': None})
        self.send(text_data=json.dumps(context))

simply, is a data is passed in to the websocket it will return a user id of None for AnonymousUser.

1.0.0 (2021-01-20)

  • First release on PyPI.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-channels-jwt-auth-middleware-1.0.0.tar.gz (4.8 kB view details)

Uploaded Source

File details

Details for the file django-channels-jwt-auth-middleware-1.0.0.tar.gz.

File metadata

  • Download URL: django-channels-jwt-auth-middleware-1.0.0.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.24.0 setuptools/51.3.3 requests-toolbelt/0.9.1 tqdm/4.56.0 CPython/3.8.5

File hashes

Hashes for django-channels-jwt-auth-middleware-1.0.0.tar.gz
Algorithm Hash digest
SHA256 7fdaaf419ef7f800d0da990d8e0ca53f7d120a66de7fb4446f77607ea3b3dd76
MD5 b34fa15c5d551cd334e881ac7027af01
BLAKE2b-256 a738e0ebc367cded21b4ef7d7c484e139aebd6583e8d2dd25d668a908bf42761

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.0.0 This release

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page