Django

⌘K
  1. Home
  2. Django
  3. Security setup
  4. Security in Django
  5. ১. ৮ Django Rest Framework (DRF) দিয়ে সুরক্ষিতভাবে টোকেন প্রদান এবং React.js থেকে সঠিকভাবে টোকেন রিসিভ করা

১. ৮ Django Rest Framework (DRF) দিয়ে সুরক্ষিতভাবে টোকেন প্রদান এবং React.js থেকে সঠিকভাবে টোকেন রিসিভ করা

একটি নিরাপদ পদ্ধতি হলো JWT টোকেনকে HTTP-only কুকিতে সংরক্ষণ করা, যা JavaScript কোডের মাধ্যমে অ্যাক্সেস করা যাবে না। এটি XSS (Cross-Site Scripting) আক্রমণ প্রতিরোধে সহায়তা করে। এখানে একটি বাস্তব উদাহরণ দিয়ে দেখানো হয়েছে:


Django Rest Framework দিয়ে সুরক্ষিতভাবে টোকেন প্রদান

  1. প্রথম ধাপ: JWT Authentication সেটআপ করা।ইনস্টলেশন:
pip install djangorestframework-simplejwt

সেটিংস আপডেট করা:

# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework_simplejwt',
    ...
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

from datetime import timedelta

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
}

টোকেন প্রাপ্তির জন্য একটি ভিউ তৈরি করা:

from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework.response import Response
from rest_framework import status
from django.http import JsonResponse

class CustomTokenObtainPairView(TokenObtainPairView):
    def post(self, request, *args, **kwargs):
        response = super().post(request, *args, **kwargs)
        tokens = response.data

        # টোকেন HTTP-only কুকিতে সেট করা
        response = JsonResponse({'message': 'Logged in successfully'})
        response.set_cookie(
            key='access_token',
            value=tokens['access'],
            httponly=True,  # HTTP-only কুকি
            secure=True,  # HTTPS ব্যবহারের জন্য
            samesite='Strict',  # Cross-Site রিকোয়েস্ট ব্লক করার জন্য
            max_age=300  # 5 মিনিটে মেয়াদ শেষ হবে
        )
        response.set_cookie(
            key='refresh_token',
            value=tokens['refresh'],
            httponly=True,
            secure=True,
            samesite='Strict',
            max_age=86400  # 1 দিনে মেয়াদ শেষ হবে
        )
        return response

URL সেটআপ:

from django.urls import path
from .views import CustomTokenObtainPairView

urlpatterns = [
    path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
]

React.js থেকে টোকেন রিসিভ করা এবং ব্যবহার করা

React.js থেকে টোকেন রিসিভ করার সময় কুকি ব্যবহারের কিছু নিয়ম রয়েছে।

  1. CORS সুরক্ষা নিশ্চিত করা: Django প্রজেক্টে django-cors-headers ইনস্টল করে CORS পলিসি সঠিকভাবে কনফিগার করুন।
pip install django-cors-headers

সেটিংস আপডেট করুন:

# settings.py
INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
]

CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",  # React অ্যাপের URL
]

React.js থেকে লগইন রিকোয়েস্ট পাঠানো:

// React.js ফ্রন্টএন্ড
import axios from 'axios';

const login = async (username, password) => {
    try {
        const response = await axios.post(
            'http://localhost:8000/api/token/',
            { username, password },
            { withCredentials: true }  // কুকি রিসিভ করার জন্য
        );

        if (response.data.message === 'Logged in successfully') {
            alert('Login successful!');
        }
    } catch (error) {
        console.error('Login failed:', error);
    }
};

// লগইন ফাংশন কল করার জন্য
login('yourUsername', 'yourPassword');

কেন এই পদ্ধতি সুরক্ষিত:

  1. HTTP-only কুকি: HTTP-only কুকি JavaScript এর মাধ্যমে অ্যাক্সেস করা যাবে না, যা XSS আক্রমণ প্রতিরোধে সাহায্য করে।
  2. Secure Flag: কুকি শুধুমাত্র HTTPS এর মাধ্যমে পাঠানো হয়, যা নিরাপত্তা আরও বাড়ায়।
  3. SameSite Policy: SameSite পলিসি Cross-Site রিকোয়েস্ট ব্লক করতে সাহায্য করে, CSRF আক্রমণ প্রতিরোধে কার্যকর।

অতিরিক্ত পরামর্শ:

  • টোকেন রিফ্রেশ ব্যবস্থা: একটি আলাদা এন্ডপয়েন্ট তৈরি করুন যা রিফ্রেশ টোকেন ব্যবহার করে নতুন অ্যাক্সেস টোকেন প্রদান করবে।
  • অ্যাডিশনাল সুরক্ষা: Content Security Policy (CSP) এবং অন্যান্য নিরাপত্তা ব্যবস্থা ব্যবহার করে আরও সুরক্ষিত করা সম্ভব।

How can we help?