Skip to content

Instantly share code, notes, and snippets.

@ulgens
Created March 5, 2020 10:00
Show Gist options
  • Save ulgens/bd15cc1d966d58e29dce0e472a2137a6 to your computer and use it in GitHub Desktop.
Save ulgens/bd15cc1d966d58e29dce0e472a2137a6 to your computer and use it in GitHub Desktop.
JWT (headers) auth stack for django-channels
import jwt
from channels.auth import AuthMiddlewareStack
from django.conf import settings
from django.contrib.auth.models import AnonymousUser
from django.db import close_old_connections
from rest_framework.authtoken.models import Token
from members.models import MemberProfile
class JWTAuthMiddleware:
def __init__(self, inner):
self.inner = inner
def __call__(self, scope):
headers = dict(scope['headers'])
if b'authorization' in headers:
try:
token_name, token_key = headers[b'authorization'].decode().split()
if token_name == 'Token':
decoded_data = jwt.decode(token_key, settings.JWT_PUBLIC_KEY, algorithm="RS256")
user = MemberProfile.objects.get(id=decoded_data["member"]).user
scope['user'] = user
close_old_connections()
except Token.DoesNotExist:
scope['user'] = AnonymousUser()
else:
scope['user'] = AnonymousUser()
return self.inner(scope)
JWTAuthMiddlewareStack = lambda inner: JWTAuthMiddleware(AuthMiddlewareStack(inner))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment