1+ from typing import Optional , Set , Tuple , TypeVar
2+
13from django .contrib .auth import get_user_model
4+ from django .contrib .auth .models import AbstractBaseUser
25from django .utils .translation import gettext_lazy as _
36from rest_framework import HTTP_HEADER_ENCODING , authentication
7+ from rest_framework .request import Request
48
59from .exceptions import AuthenticationFailed , InvalidToken , TokenError
10+ from .models import TokenUser
611from .settings import api_settings
12+ from .tokens import Token
713
814AUTH_HEADER_TYPES = api_settings .AUTH_HEADER_TYPES
915
1016if not isinstance (api_settings .AUTH_HEADER_TYPES , (list , tuple )):
1117 AUTH_HEADER_TYPES = (AUTH_HEADER_TYPES ,)
1218
13- AUTH_HEADER_TYPE_BYTES = {h .encode (HTTP_HEADER_ENCODING ) for h in AUTH_HEADER_TYPES }
19+ AUTH_HEADER_TYPE_BYTES : Set [bytes ] = {
20+ h .encode (HTTP_HEADER_ENCODING ) for h in AUTH_HEADER_TYPES
21+ }
22+
23+ AuthUser = TypeVar ("AuthUser" , AbstractBaseUser , TokenUser )
1424
1525
1626class JWTAuthentication (authentication .BaseAuthentication ):
@@ -22,11 +32,11 @@ class JWTAuthentication(authentication.BaseAuthentication):
2232 www_authenticate_realm = "api"
2333 media_type = "application/json"
2434
25- def __init__ (self , * args , ** kwargs ):
35+ def __init__ (self , * args , ** kwargs ) -> None :
2636 super ().__init__ (* args , ** kwargs )
2737 self .user_model = get_user_model ()
2838
29- def authenticate (self , request ) :
39+ def authenticate (self , request : Request ) -> Optional [ Tuple [ AuthUser , Token ]] :
3040 header = self .get_header (request )
3141 if header is None :
3242 return None
@@ -39,13 +49,13 @@ def authenticate(self, request):
3949
4050 return self .get_user (validated_token ), validated_token
4151
42- def authenticate_header (self , request ) :
52+ def authenticate_header (self , request : Request ) -> str :
4353 return '{} realm="{}"' .format (
4454 AUTH_HEADER_TYPES [0 ],
4555 self .www_authenticate_realm ,
4656 )
4757
48- def get_header (self , request ) :
58+ def get_header (self , request : Request ) -> bytes :
4959 """
5060 Extracts the header containing the JSON web token from the given
5161 request.
@@ -58,7 +68,7 @@ def get_header(self, request):
5868
5969 return header
6070
61- def get_raw_token (self , header ) :
71+ def get_raw_token (self , header : bytes ) -> Optional [ bytes ] :
6272 """
6373 Extracts an unvalidated JSON web token from the given "Authorization"
6474 header value.
@@ -81,7 +91,7 @@ def get_raw_token(self, header):
8191
8292 return parts [1 ]
8393
84- def get_validated_token (self , raw_token ) :
94+ def get_validated_token (self , raw_token : bytes ) -> Token :
8595 """
8696 Validates an encoded JSON web token and returns a validated token
8797 wrapper object.
@@ -106,7 +116,7 @@ def get_validated_token(self, raw_token):
106116 }
107117 )
108118
109- def get_user (self , validated_token ) :
119+ def get_user (self , validated_token : Token ) -> AuthUser :
110120 """
111121 Attempts to find and return a user using the given validated token.
112122 """
@@ -132,7 +142,7 @@ class JWTStatelessUserAuthentication(JWTAuthentication):
132142 token provided in a request header without performing a database lookup to obtain a user instance.
133143 """
134144
135- def get_user (self , validated_token ) :
145+ def get_user (self , validated_token : Token ) -> AuthUser :
136146 """
137147 Returns a stateless user object which is backed by the given validated
138148 token.
@@ -148,7 +158,7 @@ def get_user(self, validated_token):
148158JWTTokenUserAuthentication = JWTStatelessUserAuthentication
149159
150160
151- def default_user_authentication_rule (user ) :
161+ def default_user_authentication_rule (user : AuthUser ) -> bool :
152162 # Prior to Django 1.10, inactive users could be authenticated with the
153163 # default `ModelBackend`. As of Django 1.10, the `ModelBackend`
154164 # prevents inactive users from authenticating. App designers can still
0 commit comments