Created
March 5, 2020 10:00
-
-
Save ulgens/bd15cc1d966d58e29dce0e472a2137a6 to your computer and use it in GitHub Desktop.
JWT (headers) auth stack for django-channels
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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