Authentication helps check who a user is before giving access. Token and JWT are ways to do this safely in Django REST Framework.
DRF authentication (Token, JWT) in Django
Start learning this pattern below
Jump into concepts and practice - no test required
or
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Syntax
Django
from rest_framework.authentication import TokenAuthentication from rest_framework_simplejwt.authentication import JWTAuthentication # In your Django settings.py REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', # For Token auth 'rest_framework_simplejwt.authentication.JWTAuthentication', # For JWT auth ], }
TokenAuthentication uses a simple token string to identify users.
JWTAuthentication uses JSON Web Tokens that include encoded user info and expiry.
Examples
Django
# Token Authentication example from rest_framework.authentication import TokenAuthentication from rest_framework.views import APIView from rest_framework.response import Response class MyView(APIView): authentication_classes = [TokenAuthentication] def get(self, request): return Response({'message': 'Hello, token user!'})
Django
# JWT Authentication example from rest_framework_simplejwt.authentication import JWTAuthentication from rest_framework.views import APIView from rest_framework.response import Response class MyView(APIView): authentication_classes = [JWTAuthentication] def get(self, request): return Response({'message': 'Hello, JWT user!'})
Sample Program
This API view requires a valid token to access. It greets the logged-in user by name.
Django
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated class HelloTokenView(APIView): authentication_classes = [TokenAuthentication] permission_classes = [IsAuthenticated] def get(self, request): username = request.user.username return Response({'message': f'Hello, {username}! You are authenticated with Token.'})
Important Notes
Tokens must be sent in the HTTP header as Authorization: Token <token> for TokenAuthentication.
JWT tokens are sent as Authorization: Bearer <jwt_token>.
Always keep tokens secret and use HTTPS to protect them in transit.
Summary
Token and JWT are ways to check who is using your API safely.
TokenAuthentication uses simple tokens; JWTAuthentication uses encoded tokens with expiry.
Use authentication classes in your views or settings to protect your API endpoints.
Practice
1. What is the main difference between TokenAuthentication and JWTAuthentication in Django REST Framework?
easy
Solution
Step 1: Understand TokenAuthentication
TokenAuthentication uses a simple token string stored on the server and sent by the client to identify the user.Step 2: Understand JWTAuthentication
JWTAuthentication uses JSON Web Tokens that are encoded, include expiry info, and do not require server storage.Final Answer:
TokenAuthentication uses simple tokens stored on the server; JWTAuthentication uses encoded tokens with expiry. -> Option AQuick Check:
Token vs JWT difference = D [OK]
Hint: Token is simple stored string; JWT is encoded with expiry [OK]
Common Mistakes:
- Thinking JWT tokens are stored on the server
- Confusing token encryption with encoding
- Assuming TokenAuthentication requires password every request
2. Which of the following is the correct way to add TokenAuthentication to a Django REST Framework view?
easy
Solution
Step 1: Recall how to import and use authentication classes
Authentication classes must be imported and instantiated, so use TokenAuthentication() not just the class name or string.Step 2: Check syntax for authentication_classes
It expects a list of authentication class instances, so the correct syntax is [TokenAuthentication()] with parentheses.Final Answer:
authentication_classes = [TokenAuthentication()] -> Option DQuick Check:
Use class instances in list = A [OK]
Hint: Use class instances with parentheses in authentication_classes list [OK]
Common Mistakes:
- Using strings instead of class instances
- Forgetting parentheses after class name
- Not importing TokenAuthentication before use
3. Given this Django REST Framework view snippet using JWTAuthentication, what will happen if the token is expired?
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.views import APIView
from rest_framework.response import Response
class MyView(APIView):
authentication_classes = [JWTAuthentication()]
def get(self, request):
return Response({"user": str(request.user)})medium
Solution
Step 1: Understand JWTAuthentication behavior on expired tokens
JWTAuthentication checks token expiry and rejects requests with expired tokens by raising an authentication error.Step 2: Effect on the APIView request
When token is expired, the request is denied with a 401 Unauthorized response automatically by DRF.Final Answer:
The request will be denied with a 401 Unauthorized error. -> Option CQuick Check:
Expired JWT causes 401 error = B [OK]
Hint: Expired JWT tokens cause 401 Unauthorized error [OK]
Common Mistakes:
- Assuming expired token returns user as None
- Thinking expired token lets request pass
- Expecting server crash on expired token
4. You wrote this code to enable TokenAuthentication but your API always returns 403 Forbidden. What is the likely mistake?
from rest_framework.authentication import TokenAuthentication
class MyView(APIView):
authentication_classes = [TokenAuthentication]
def get(self, request):
return Response({"message": "Hello"})medium
Solution
Step 1: Check authentication_classes syntax
authentication_classes must contain instances, so TokenAuthentication() with parentheses, not the class itself.Step 2: Effect of missing parentheses
Without parentheses, DRF does not recognize the authentication class properly, causing 403 Forbidden errors.Final Answer:
Forgot to add parentheses after TokenAuthentication in authentication_classes. -> Option AQuick Check:
Use TokenAuthentication() not TokenAuthentication = C [OK]
Hint: Always instantiate authentication classes with () [OK]
Common Mistakes:
- Using class name without parentheses
- Confusing 403 with 401 errors
- Changing method name unnecessarily
5. You want to protect an API endpoint so only users with a valid JWT token can access it, and you want tokens to expire after 5 minutes. Which settings and code changes should you apply?
hard
Solution
Step 1: Configure JWT token expiry
In Django REST Framework Simple JWT, set ACCESS_TOKEN_LIFETIME to 5 minutes using timedelta in settings.Step 2: Use JWTAuthentication in the view
Set authentication_classes = [JWTAuthentication()] to enforce JWT token authentication on the endpoint.Final Answer:
Set SIMPLE_JWT['ACCESS_TOKEN_LIFETIME'] = timedelta(minutes=5) in settings and use JWTAuthentication() in authentication_classes. -> Option BQuick Check:
JWT expiry + JWTAuthentication = A [OK]
Hint: Set ACCESS_TOKEN_LIFETIME and use JWTAuthentication() [OK]
Common Mistakes:
- Using TokenAuthentication instead of JWTAuthentication
- Setting wrong expiry setting names
- Trying to manually check token expiry in views
