मजबूत ऑथेंटिकेशनसह आपले Django REST फ्रेमवर्क API सुरक्षित करा. टोकन ऑथेंटिकेशन आणि JWT (JSON वेब टोकन) अंमलबजावणीची तुलना, व्यावहारिक कोड उदाहरणे आणि सर्वोत्तम पद्धतींसह.
पायथन DRF ऑथेंटिकेशन: मजबूत API साठी टोकन वि. JWT अंमलबजावणी
तुमचे API सुरक्षित करणे अत्यंत महत्त्वाचे आहे. पायथन आणि जँगो रेस्ट फ्रेमवर्क (DRF) सह API तयार करताना, तुमच्यासाठी अनेक ऑथेंटिकेशन पर्याय उपलब्ध आहेत. हा लेख दोन लोकप्रिय पद्धतींचा शोध घेतो: टोकन ऑथेंटिकेशन आणि JWT (JSON वेब टोकन) ऑथेंटिकेशन, त्यांच्यातील साम्य आणि भेद यांची तुलना करून, आणि व्यावहारिक अंमलबजावणीची उदाहरणे देतो.
API मधील ऑथेंटिकेशन समजून घेणे
ऑथेंटिकेशन ही तुमच्या API मध्ये प्रवेश करणाऱ्या वापरकर्त्याची किंवा ॲप्लिकेशनची ओळख पडताळण्याची प्रक्रिया आहे. एक चांगल्या प्रकारे लागू केलेली ऑथेंटिकेशन प्रणाली हे सुनिश्चित करते की केवळ अधिकृत वापरकर्तेच संरक्षित संसाधनांमध्ये प्रवेश करू शकतात. RESTful API च्या संदर्भात, ऑथेंटिकेशनमध्ये सामान्यतः प्रत्येक विनंतीसोबत क्रेडेन्शियल्स (उदा. वापरकर्तानाव आणि पासवर्ड) पाठवणे समाविष्ट असते. त्यानंतर सर्व्हर या क्रेडेन्शियल्सची पडताळणी करतो आणि वैध असल्यास, प्रवेश मंजूर करतो.
टोकन ऑथेंटिकेशन
टोकन ऑथेंटिकेशन ही एक सोपी आणि सरळ यंत्रणा आहे. जेव्हा एखादा वापरकर्ता यशस्वीरित्या लॉग इन करतो, तेव्हा सर्व्हर एक अद्वितीय, यादृच्छिक (random) टोकन तयार करतो आणि ते डेटाबेसमध्ये संग्रहित करतो, त्याला वापरकर्त्याशी जोडतो. त्यानंतर क्लायंट हे टोकन पुढील विनंत्यांच्या 'Authorization' हेडरमध्ये पाठवतो. सर्व्हर डेटाबेसमधून टोकन प्राप्त करतो, त्याची वैधता तपासतो आणि त्यानुसार प्रवेश मंजूर करतो.
DRF सह अंमलबजावणी
DRF टोकन ऑथेंटिकेशनसाठी अंगभूत (built-in) समर्थन प्रदान करते. ते कसे लागू करायचे ते येथे आहे:
- तुमच्या जँगो प्रोजेक्टमध्ये DRF इंस्टॉल करा आणि नोंदणी करा:
प्रथम, तुमच्याकडे जँगो रेस्ट फ्रेमवर्क इंस्टॉल असल्याची खात्री करा:
pip install djangorestframework
नंतर, ते तुमच्या `settings.py` मधील `INSTALLED_APPS` मध्ये जोडा:
INSTALLED_APPS = [
...
'rest_framework',
]
- टोकन ऑथेंटिकेशन स्कीम डिफॉल्ट ऑथेंटिकेशन क्लास म्हणून जोडा (ऐच्छिक, पण शिफारस केलेले):
तुमच्या `settings.py` फाईलमध्ये, खालीलप्रमाणे जोडा:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
}
हे तुमच्या API वर जागतिक स्तरावर टोकन ऑथेंटिकेशन लागू करेल. `SessionAuthentication` ब्राउझर-आधारित संवादासाठी समाविष्ट आहे, परंतु तुम्ही ते पूर्णपणे API-चालित ॲप्लिकेशनसाठी काढू शकता.
- प्रत्येक वापरकर्त्यासाठी एक टोकन तयार करा:
तुम्ही सिग्नल हँडलर जोडून वापरकर्ते तयार झाल्यावर आपोआप टोकन तयार करू शकता. तुमच्या ॲपमध्ये `signals.py` नावाची फाइल तयार करा (उदा., `users/signals.py`):
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
नंतर, तुमच्या ॲप कॉन्फिगरेशन क्लासच्या `ready` पद्धतीमध्ये तुमच्या `users/apps.py` फाईलमध्ये ही `signals.py` फाईल इम्पोर्ट करा. `users/apps.py` साठी उदाहरण:
from django.apps import AppConfig
class UsersConfig(AppConfig):
default_auto_field = 'django.db.BigAutoField'
name = 'users'
def ready(self):
import users.signals
आता तुम्ही कमांड लाइन वापरून टोकन व्यवस्थापित करू शकता:
python manage.py drf_create_token <username>
- तुमचे API व्ह्यूज लागू करा:
येथे एका व्ह्यूचे सोपे उदाहरण आहे ज्यासाठी टोकन ऑथेंटिकेशन आवश्यक आहे:
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
class ExampleView(APIView):
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
content = {
'message': 'Hello, ' + request.user.username + '! You are authenticated.',
}
return Response(content)
या उदाहरणात, `authentication_classes` निर्दिष्ट करते की टोकन ऑथेंटिकेशन वापरले पाहिजे, आणि `permission_classes` निर्दिष्ट करते की केवळ प्रमाणीकृत वापरकर्तेच व्ह्यूमध्ये प्रवेश करू शकतात.
- लॉगिन API व्ह्यू समाविष्ट करा:
यशस्वी लॉगिनवर टोकन तयार करण्यासाठी तुम्हाला एका एंडपॉइंटची देखील आवश्यकता आहे:
from django.contrib.auth import authenticate
from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
@api_view(['POST'])
@permission_classes([AllowAny])
def login(request):
username = request.data.get('username')
password = request.data.get('password')
user = authenticate(username=username, password=password)
if user:
token, _ = Token.objects.get_or_create(user=user)
return Response({'token': token.key})
else:
return Response({'error': 'Invalid Credentials'}, status=status.HTTP_401_UNAUTHORIZED)
टोकन ऑथेंटिकेशनचे फायदे
- साधेपणा: लागू करणे आणि समजणे सोपे.
- स्टेटलेस: प्रत्येक टोकन विनंतीमध्ये अशी माहिती असते जी तिला स्वतंत्रपणे कार्य करण्यास अनुमती देते.
टोकन ऑथेंटिकेशनचे तोटे
- डेटाबेस अवलंबित्व: टोकनची पडताळणी करण्यासाठी प्रत्येक विनंतीसाठी डेटाबेस लुकअप आवश्यक आहे. यामुळे कार्यक्षमतेवर परिणाम होऊ शकतो, विशेषतः मोठ्या प्रमाणात.
- टोकन रद्द करणे: टोकन रद्द करण्यासाठी ते डेटाबेसमधून हटवणे आवश्यक आहे, जे गुंतागुंतीचे असू शकते.
- स्केलेबिलिटी: डेटाबेस ओव्हरहेडमुळे मोठ्या, उच्च-ट्रॅफिक API साठी ही सर्वात स्केलेबल पद्धत असू शकत नाही.
JWT (JSON वेब टोकन) ऑथेंटिकेशन
JWT ऑथेंटिकेशन ही एक अधिक आधुनिक आणि अत्याधुनिक पद्धत आहे. JWT एक संक्षिप्त, URL-सुरक्षित JSON ऑब्जेक्ट आहे ज्यामध्ये वापरकर्त्याबद्दलचे दावे (claims) असतात. हे दावे एका गुप्त की (secret key) किंवा सार्वजनिक/खाजगी की जोडीचा वापर करून डिजिटल स्वाक्षरी केलेले असतात. जेव्हा एखादा वापरकर्ता लॉग इन करतो, तेव्हा सर्व्हर एक JWT तयार करतो आणि तो क्लायंटला पाठवतो. त्यानंतर क्लायंट हे JWT पुढील विनंत्यांच्या 'Authorization' हेडरमध्ये समाविष्ट करतो. सर्व्हर डेटाबेसमध्ये प्रवेश न करता JWT च्या स्वाक्षरीची पडताळणी करू शकतो, ज्यामुळे ते अधिक कार्यक्षम आणि स्केलेबल बनते.
DRF सह अंमलबजावणी
DRF JWT ऑथेंटिकेशनसाठी अंगभूत समर्थन देत नाही, परंतु अनेक उत्कृष्ट लायब्ररी हे एकत्रीकरण सोपे करतात. त्यापैकी सर्वात लोकप्रिय `djangorestframework-simplejwt` आहे.
- `djangorestframework-simplejwt` इंस्टॉल करा:
pip install djangorestframework-simplejwt
- DRF सेटिंग्ज कॉन्फिगर करा:
तुमच्या `settings.py` फाईलमध्ये, खालीलप्रमाणे जोडा:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': settings.SECRET_KEY,
'VERIFYING_KEY': None,
'AUTH_HEADER_TYPES': ('Bearer',),
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
}
सेटिंग्जचे स्पष्टीकरण:
- `ACCESS_TOKEN_LIFETIME`: ॲक्सेस टोकन किती काळ वैध आहे (उदाहरण, 5 मिनिटे).
- `REFRESH_TOKEN_LIFETIME`: रिफ्रेश टोकन किती काळ वैध आहे (उदाहरण, 1 दिवस). रिफ्रेश टोकन वापरकर्त्याला पुन्हा लॉग इन न करता नवीन ॲक्सेस टोकन मिळविण्यासाठी वापरले जातात.
- `ROTATE_REFRESH_TOKENS`: प्रत्येक वापरानंतर रिफ्रेश टोकन फिरवायचे की नाही.
- `BLACKLIST_AFTER_ROTATION`: रोटेशननंतर जुने रिफ्रेश टोकन ब्लॅकलिस्ट करायचे की नाही.
- `ALGORITHM`: JWT वर स्वाक्षरी करण्यासाठी वापरलेला अल्गोरिदम (HS256 एक सामान्य निवड आहे).
- `SIGNING_KEY`: JWT वर स्वाक्षरी करण्यासाठी वापरलेली गुप्त की (सामान्यतः तुमची जँगो SECRET_KEY).
- `AUTH_HEADER_TYPES`: ऑथोरायझेशन हेडरचा प्रकार (सामान्यतः "Bearer").
- लॉगिन आणि रिफ्रेश टोकन API व्ह्यूज समाविष्ट करा:
`djangorestframework-simplejwt` टोकन मिळवण्यासाठी आणि रिफ्रेश करण्यासाठी व्ह्यूज प्रदान करते. त्यांना तुमच्या `urls.py` मध्ये समाविष्ट करा:
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
`TokenObtainPairView` यशस्वी ऑथेंटिकेशननंतर ॲक्सेस आणि रिफ्रेश टोकन प्रदान करते. `TokenRefreshView` वैध रिफ्रेश टोकन दिल्यावर नवीन ॲक्सेस टोकन प्रदान करते.
- तुमचे API व्ह्यूज लागू करा:
येथे एका व्ह्यूचे सोपे उदाहरण आहे ज्यासाठी JWT ऑथेंटिकेशन आवश्यक आहे:
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.authentication import JWTAuthentication
class ExampleView(APIView):
authentication_classes = [JWTAuthentication]
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
content = {
'message': 'Hello, ' + request.user.username + '! You are authenticated.',
}
return Response(content)
टोकन ऑथेंटिकेशनच्या उदाहरणाप्रमाणे, `authentication_classes` निर्दिष्ट करते की JWT ऑथेंटिकेशन वापरले पाहिजे, आणि `permission_classes` केवळ प्रमाणीकृत वापरकर्त्यांसाठी प्रवेश प्रतिबंधित करते.
JWT ऑथेंटिकेशनचे फायदे
- स्केलेबिलिटी: टोकनच्या पडताळणीसाठी डेटाबेस लुकअप आवश्यक नाही, ज्यामुळे ते अधिक स्केलेबल बनते.
- स्टेटलेस: JWT मध्ये ऑथेंटिकेशनसाठी आवश्यक सर्व माहिती असते.
- मानकीकृत: JWT एक व्यापकपणे स्वीकारलेले मानक आहे, जे अनेक लायब्ररी आणि प्लॅटफॉर्मद्वारे समर्थित आहे.
- मायक्रोसर्व्हिसेससाठी अनुकूल: मायक्रोसर्व्हिसेस आर्किटेक्चरसाठी योग्य, कारण सेवा स्वतंत्रपणे JWTs ची पडताळणी करू शकतात.
JWT ऑथेंटिकेशनचे तोटे
- गुंतागुंत: टोकन ऑथेंटिकेशनपेक्षा लागू करणे अधिक गुंतागुंतीचे आहे.
- टोकनचा आकार: JWTs साध्या टोकनपेक्षा मोठे असू शकतात, ज्यामुळे बँडविड्थचा वापर वाढू शकतो.
- टोकन रद्द करणे: JWT रद्द करणे आव्हानात्मक आहे. एकदा जारी केल्यावर, ते त्याच्या मुदत संपेपर्यंत वैध असते. यावरील उपायांमध्ये रद्द केलेले टोकन ब्लॅकलिस्ट करणे समाविष्ट आहे, ज्यामुळे पुन्हा डेटाबेस अवलंबित्व येते.
टोकन रद्द करण्याच्या धोरणे
टोकन आणि JWT ऑथेंटिकेशन दोन्ही पद्धतींना प्रवेश रद्द करण्यासाठी यंत्रणेची आवश्यकता असते. तुम्ही टोकन रद्द करण्याच्या दृष्टिकोनात कसे येऊ शकता ते येथे आहे:
टोकन ऑथेंटिकेशन रद्द करणे
टोकन ऑथेंटिकेशनसह, रद्द करणे सोपे आहे: फक्त डेटाबेसमधून टोकन हटवा:
from rest_framework.authtoken.models import Token
try:
token = Token.objects.get(user=request.user)
token.delete()
except Token.DoesNotExist:
pass
JWT ऑथेंटिकेशन रद्द करणे
JWT रद्द करणे अधिक गुंतागुंतीचे आहे कारण टोकन स्वतःच स्वयंपूर्ण असते आणि पडताळणीसाठी (सुरुवातीला) डेटाबेस लुकअपवर अवलंबून नसते. सामान्य धोरणांमध्ये समाविष्ट आहे:
- टोकन ब्लॅकलिस्टिंग: रद्द केलेले टोकन ब्लॅकलिस्टमध्ये संग्रहित करा (उदा. डेटाबेस टेबल किंवा Redis कॅशे). JWT ची पडताळणी करण्यापूर्वी, ते ब्लॅकलिस्टमध्ये आहे की नाही ते तपासा. `djangorestframework-simplejwt` रिफ्रेश टोकन ब्लॅकलिस्ट करण्यासाठी अंगभूत समर्थन प्रदान करते.
- लहान मुदतीची वेळ: लहान ॲक्सेस टोकन मुदतीची वेळ वापरा आणि वारंवार नवीन ॲक्सेस टोकन मिळविण्यासाठी रिफ्रेश टोकनवर अवलंबून रहा. यामुळे तडजोड झालेल्या टोकनचा वापर होण्याची शक्यता कमी होते.
- रिफ्रेश टोकन फिरवा: प्रत्येक वापरानंतर रिफ्रेश टोकन फिरवा. यामुळे प्रत्येक वेळी जुने टोकन अवैध होतील आणि टोकनची चोरी टाळता येईल.
OAuth2 आणि OpenID Connect
अधिक गुंतागुंतीच्या ऑथेंटिकेशन आणि ऑथोरायझेशन परिस्थितींसाठी, OAuth2 आणि OpenID Connect वापरण्याचा विचार करा. ही मानके क्रेडेन्शियल्स शेअर न करता संसाधनांमध्ये प्रवेश देण्याकरिता एक मजबूत फ्रेमवर्क प्रदान करतात. OAuth2 प्रामुख्याने एक ऑथोरायझेशन प्रोटोकॉल आहे, तर OpenID Connect OAuth2 वर आधारित ऑथेंटिकेशन सेवा प्रदान करते. `django-oauth-toolkit` आणि `django-allauth` सारखी अनेक जँगो पॅकेजेस तुमच्या DRF API मध्ये OAuth2 आणि OpenID Connect चे एकत्रीकरण सुलभ करतात.
उदाहरण परिस्थिती: एका वापरकर्त्याला तुमच्या API मध्ये संग्रहित असलेल्या त्यांच्या डेटामध्ये तृतीय-पक्ष ॲप्लिकेशनला प्रवेश द्यायचा आहे. OAuth2 सह, वापरकर्ता त्यांचे वापरकर्तानाव आणि पासवर्ड शेअर न करता ॲप्लिकेशनला अधिकृत करू शकतो. त्याऐवजी, ॲप्लिकेशनला एक ॲक्सेस टोकन मिळते जे ते परिभाषित परवानगीच्या व्याप्तीमध्ये वापरकर्त्याच्या डेटामध्ये प्रवेश करण्यासाठी वापरू शकते.
योग्य ऑथेंटिकेशन पद्धत निवडणे
सर्वोत्तम ऑथेंटिकेशन पद्धत तुमच्या विशिष्ट आवश्यकतांवर अवलंबून असते:
- अंमलबजावणीची साधेपणा आणि गती: टोकन ऑथेंटिकेशन सुरुवातीला लागू करणे सामान्यतः सोपे असते.
- स्केलेबिलिटी: JWT ऑथेंटिकेशन उच्च-ट्रॅफिक API साठी अधिक स्केलेबल आहे.
- सुरक्षिततेची आवश्यकता: तुमच्या डेटाच्या संवेदनशीलतेचा आणि आवश्यक असलेल्या सुरक्षिततेच्या पातळीचा विचार करा. OAuth2/OpenID Connect सर्वात मजबूत सुरक्षा वैशिष्ट्ये देतात परंतु त्यासाठी अधिक गुंतागुंतीच्या अंमलबजावणीची आवश्यकता असते.
- मायक्रोसर्व्हिसेस आर्किटेक्चर: JWTs मायक्रोसर्व्हिसेससाठी योग्य आहेत, कारण प्रत्येक सेवा स्वतंत्रपणे टोकनची पडताळणी करू शकते.
API ऑथेंटिकेशनसाठी सर्वोत्तम पद्धती
- HTTPS वापरा: क्लायंट आणि सर्व्हरमधील संवाद एनक्रिप्ट करण्यासाठी नेहमी HTTPS वापरा, जे क्रेडेन्शियल्सला चोरून ऐकण्यापासून वाचवते.
- गुपिते सुरक्षितपणे संग्रहित करा: गुप्त की किंवा पासवर्ड कधीही साध्या मजकूरात संग्रहित करू नका. पर्यावरण व्हेरिएबल्स किंवा सुरक्षित कॉन्फिगरेशन व्यवस्थापन साधने वापरा.
- रेट लिमिटिंग लागू करा: तुमच्या API चा गैरवापर होण्यापासून संरक्षण करण्यासाठी रेट लिमिटिंग लागू करा, जेणेकरून क्लायंट दिलेल्या वेळेत किती विनंत्या करू शकतो यावर मर्यादा येईल.
- इनपुटची पडताळणी करा: इंजेक्शन हल्ल्यांपासून बचाव करण्यासाठी सर्व इनपुट डेटाची कसून पडताळणी करा.
- निरीक्षण आणि लॉगिंग: तुमच्या API वर संशयास्पद हालचालींवर लक्ष ठेवा आणि ऑडिटिंगच्या उद्देशाने ऑथेंटिकेशन इव्हेंट लॉग करा.
- नियमितपणे लायब्ररी अपडेट करा: सुरक्षा पॅच आणि सुधारणांचा लाभ घेण्यासाठी तुमचे जँगो, DRF आणि ऑथेंटिकेशन लायब्ररी अद्ययावत ठेवा.
- CORS (Cross-Origin Resource Sharing) लागू करा: वेब ब्राउझरमधून तुमच्या API मध्ये प्रवेश करण्यासाठी केवळ विश्वसनीय डोमेनला परवानगी देण्यासाठी CORS योग्यरित्या कॉन्फिगर करा.
निष्कर्ष
तुमचे DRF API सुरक्षित करण्यासाठी योग्य ऑथेंटिकेशन पद्धत निवडणे महत्त्वाचे आहे. टोकन ऑथेंटिकेशन साधेपणा प्रदान करते, तर JWT ऑथेंटिकेशन स्केलेबिलिटी आणि लवचिकता प्रदान करते. प्रत्येक पद्धतीचे फायदे आणि तोटे समजून घेणे, तसेच API सुरक्षेसाठी सर्वोत्तम पद्धती, तुम्हाला मजबूत आणि सुरक्षित API तयार करण्यास सक्षम करेल जे तुमचा डेटा आणि वापरकर्त्यांचे संरक्षण करेल.
तुमच्या विशिष्ट गरजांचा विचार करण्याचे लक्षात ठेवा आणि सुरक्षा, कार्यक्षमता आणि अंमलबजावणीची सुलभता यांच्यात सर्वोत्तम संतुलन साधणारा उपाय निवडा. अधिक गुंतागुंतीच्या ऑथोरायझेशन परिस्थितींसाठी OAuth2 आणि OpenID Connect चा शोध घ्या.