रेस्ट फ्रेमवर्क टोकन्ससह जँगो-टेनंट सबडोमेन लॉगिन त्रुटींचे निराकरण करणे

Authentication

Django-भाडेकरूंमध्ये सबडोमेन लॉगिन का खंडित होतात: एक वास्तविक-जागतिक कोडे

एक मल्टी-टेनंट जँगो ॲप्लिकेशन तयार करण्याची कल्पना करा जिथे प्रत्येक सबडोमेन वेगळ्या भाडेकरूला सेवा देतो, अखंडपणे वापरकर्ता प्रमाणीकरण समाकलित करतो. जोपर्यंत सबडोमेनवरील लॉगिन पृष्ठ भयंकर होत नाही तोपर्यंत सर्वकाही परिपूर्ण दिसते . आपण आपले डोके खाजवतो, का आश्चर्य लॉगिन निर्दोषपणे कार्य करते, परंतु सबडोमेन लॉगिन करत नाही. 🤔

ही समस्या निराशाजनक आहे कारण ती एक विरोधाभास वाटत आहे: सिस्टम वापरकर्त्यांना स्पष्टपणे ओळखते कारण तुम्ही प्रशासक पॅनेलमध्ये लॉग इन करू शकता. एकदा लॉग इन केल्यानंतर, तुम्ही भाडेकरू-विशिष्ट पृष्ठांमध्ये प्रवेश करू शकता आणि फॉर्म यशस्वीरित्या सबमिट करू शकता. तरीही, जेव्हा तुम्ही लॉगिन पृष्ठावर क्लिक करता, तेव्हा एक त्रुटी उद्भवते: हुड अंतर्गत खरोखर काय चालले आहे?

मी एक संबंधित उदाहरण सामायिक करू. हे घराला दोन दरवाजे असल्यासारखे आहे—एक पाहुण्यांसाठी (तुमचे मुख्य डोमेन) आणि एक कुटुंबासाठी (सबडोमेन). पाहुण्यांचा दरवाजा चांगला चालतो, पण कुटुंबाचा दरवाजा जाम होतो. तुम्हाला माहिती आहे की कळा बरोबर आहेत, परंतु लॉक यंत्रणेमध्ये काहीतरी खोलवर चुकीचे आहे - जसे की डेटाबेस स्कीमा क्वेरींमध्ये अनपेक्षित जुळत नाही.

या समस्येचे मूळ जँगो रेस्ट फ्रेमवर्क कसे आहे यात आहे शी संवाद साधतो लायब्ररी विशेषत:, टोकन विरुद्ध क्वेरी केली जाते भाडेकरू स्कीमा ऐवजी, ज्यामुळे a विदेशीकी उल्लंघन त्रुटी चला या समस्येत जाऊ या, कारण शोधूया आणि तुमच्या सर्व सबडोमेनसाठी लॉगिन दरवाजा निश्चित करूया! 🔧

आज्ञा वापराचे उदाहरण
schema_context() मल्टी-टेनंट जँगो सेटअपमध्ये स्कीमा दरम्यान स्विच करण्याची अनुमती देते. उदाहरण: schema_context('tenant_name') सह: निर्दिष्ट भाडेकरूच्या डेटाबेस स्कीमामध्ये ऑपरेशन्स अंमलात आल्याची खात्री करते.
authenticate() वापरकर्त्याला त्यांची क्रेडेन्शियल वापरून प्रमाणीकृत करते. उदाहरण: वापरकर्ता = प्रमाणीकरण(विनंती, वापरकर्तानाव=वापरकर्तानाव, पासवर्ड=पासवर्ड) प्रदान केलेली क्रेडेन्शियल्स वैध आहेत का ते तपासते.
Token.objects.get_or_create() वापरकर्त्यासाठी विद्यमान टोकन पुनर्प्राप्त करते किंवा ते अस्तित्वात नसल्यास ते तयार करते. उदाहरण: टोकन, निर्मित = Token.objects.get_or_create(user=user).
csrf_exempt विशिष्ट दृश्यासाठी CSRF संरक्षण अक्षम करते. उदाहरण: बाह्य किंवा ब्राउझर नसलेल्या API विनंत्या हाताळताना @csrf_exempt वापरले जाते.
connection.tenant.schema_name Django मल्टी-टेनंट ॲपमध्ये वर्तमान भाडेकरूचे स्कीमा नाव पुनर्प्राप्त करते. उदाहरण: tenant_schema_name = connection.tenant.schema_name.
JsonResponse() HTTP प्रतिसाद म्हणून JSON-स्वरूपित डेटा परत करतो. उदाहरण: JsonResponse ({"status": "यशस्वी", "टोकन": token.key}) परत करा.
APIClient() Django रेस्ट फ्रेमवर्क चाचणी क्लायंट जे चाचण्यांमध्ये HTTP विनंत्या अनुकरण करण्यास अनुमती देते. उदाहरण: self.client = APIClient().
localStorage.setItem() ब्राउझरच्या स्थानिक स्टोरेजमध्ये की-व्हॅल्यू पेअर सेव्ह करते. उदाहरण: localStorage.setItem('token', data.token) भविष्यातील वापरासाठी टोकन साठवते.
Swal.fire() SweetAlert2 लायब्ररी वापरून अलर्ट पॉपअप प्रदर्शित करते. उदाहरण: Swal.fire({icon: 'error', title: 'Login Failed'}) एक शैलीबद्ध त्रुटी संदेश दाखवते.
TestCase Django मध्ये युनिट चाचण्या लिहिण्यासाठी वापरले जाते. उदाहरण: वर्ग TenantLoginTest(TestCase): स्कीमा-विशिष्ट लॉगिन चाचणीसाठी चाचणी वर्ग तयार करतो.

Django-भाडेकरू मध्ये भाडेकरू-विशिष्ट प्रमाणीकरण मास्टरींग

वर प्रदान केलेल्या स्क्रिप्ट बहु-भाडेकरू जँगो ऍप्लिकेशन्समधील एक गंभीर समस्या सोडवतात जिथे टोकन्सची चौकशी केली जाते योग्य भाडेकरू स्कीमाऐवजी. हे वर्तन घडते कारण जँगो रेस्ट फ्रेमवर्क (DRF) टोकन मॉडेल्सशी संवाद साधताना आपोआप स्कीमा बदलत नाही. याचे निराकरण करण्यासाठी, आम्ही फायदा घेतो लायब्ररीचे पद्धत, आम्हाला योग्य भाडेकरूच्या स्कीमामध्ये डेटाबेस क्वेरी स्पष्टपणे कार्यान्वित करण्याची परवानगी देते. हे सुनिश्चित करते की वापरकर्ता प्रमाणीकरण आणि टोकन पुनर्प्राप्ती प्रत्येक भाडेकरूसाठी अखंडपणे कार्य करते, जरी प्राथमिक डोमेन किंवा सबडोमेनद्वारे प्रवेश केला गेला असला तरीही. या समायोजनाशिवाय, ForeignKeyViolation त्रुटी उद्भवते कारण सिस्टम चुकीच्या स्कीमामध्ये वापरकर्ता रेकॉर्ड शोधते.

'dual_login_view' फंक्शन टेनंट स्कीमाला डेटाबेस कनेक्शन पॉइंट सुनिश्चित करताना वापरकर्त्यांना कसे प्रमाणीकृत करायचे ते दाखवते. प्रथम, ते विनंती पेलोडमधून वापरकर्तानाव आणि पासवर्ड काढते. त्यानंतर, `ऑथेंटिकेट` पद्धत वापरून, ते क्रेडेन्शियल प्रमाणित करते. यशस्वी झाल्यास, ते वापरकर्त्याला लॉग इन करते आणि DRF च्या `Token.objects.get_or_create()` पद्धतीचा वापर करून टोकन व्युत्पन्न करते. ही क्वेरी योग्य स्कीमाला लक्ष्य करते याची खात्री करण्यासाठी, `schema_context` फंक्शन लॉजिक गुंडाळते, डेटाबेस संदर्भ सक्रिय भाडेकरू स्कीमावर स्विच करते. हे हमी देते की प्रणाली योग्य वापरकर्ता आणि टोकन रेकॉर्ड शोधू शकते, स्कीमा जुळत नसलेली त्रुटी दूर करते.

`TenantAwareLoginAPIView` वर्ग मॉड्यूलर दृष्टिकोनासाठी Django Rest Framework च्या APIView चा अवलंब करून समाधान वाढवतो. ते वापरकर्ता क्रेडेन्शियल्स असलेल्या POST विनंत्या स्वीकारते, त्यांना `प्रमाणीकरण` वापरून प्रमाणित करते आणि क्रेडेन्शियल बरोबर असल्यास टोकन व्युत्पन्न करते. महत्त्वाचे म्हणजे, योग्य भाडेकरू स्कीमामधील सर्व ऑपरेशन्स अंमलात आणण्यासाठी ते `schema_context` वापरते. हे वर्ग-आधारित दृश्य आधुनिक API अंमलबजावणीसाठी आदर्श आहे कारण ते त्रुटी हाताळणी केंद्रीकृत करते आणि स्वच्छ, संरचित प्रतिसाद प्रदान करते. उदाहरणार्थ, JSON टोकन परत करणे हे सुनिश्चित करते की फ्रंटएंड ते स्थानिक स्टोरेजमध्ये संचयित करू शकतो आणि त्यानंतरच्या प्रमाणीकृत विनंत्यांसाठी वापरू शकतो.

फ्रंटएंडवर, JavaScript फॉर्म सबमिशन स्क्रिप्ट लॉगिन एंडपॉइंटला सुरक्षित आणि संरचित विनंत्या करण्यात महत्त्वाची भूमिका बजावते. हे डीफॉल्ट फॉर्म वर्तन प्रतिबंधित करते, इनपुट फील्ड प्रमाणित करते आणि CSRF टोकनसह क्रेडेन्शियल्स फेच API विनंतीद्वारे पाठवते. यशस्वी प्रतिसाद मिळाल्यावर, टोकन `localStorage` मध्ये संग्रहित केले जाते आणि वापरकर्त्याला पुनर्निर्देशित केले जाते. सर्व्हरने एरर दिल्यास, SweetAlert2 लायब्ररी एक अनुकूल अलर्ट संदेश प्रदर्शित करते. हे वापरकर्त्याचा अनुभव नितळ बनवते आणि योग्य त्रुटी अभिप्राय सुनिश्चित करते. उदाहरणार्थ, भाडेकरू सबडोमेनमध्ये प्रवेश करताना, वैध क्रेडेन्शियल्ससह लॉग इन करणाऱ्या वापरकर्त्यास त्वरित यशस्वी संदेश दिसेल आणि अनुप्रयोग डॅशबोर्डवर पुनर्निर्देशित केले जाईल. 🔒

ऑप्टिमाइझ केलेल्या स्कीमा क्वेरीसह जँगो-भाडेकरूंमध्ये सबडोमेन लॉगिन समस्या हाताळणे

स्पष्ट स्कीमा निवड आणि त्रुटी हाताळणीसह Django ORM वापरून बॅकएंड सोल्यूशन.

# Import necessary libraries
from django.db import connection
from rest_framework.authtoken.models import Token
from django.contrib.auth import authenticate, login
from django.http import JsonResponse
from django_tenants.utils import schema_context
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def dual_login_view(request):
    """Handle login for multi-tenant subdomains with correct schema."""
    if request.method == "POST":
        username = request.POST.get("login")
        password = request.POST.get("password")
        tenant_schema_name = connection.tenant.schema_name
        try:
            # Switch to the correct tenant schema
            with schema_context(tenant_schema_name):
                user = authenticate(request, username=username, password=password)
                if user is not None:
                    login(request, user)
                    # Generate or retrieve token
                    token, created = Token.objects.get_or_create(user=user)
                    return JsonResponse({"status": "success", "token": token.key})
                else:
                    return JsonResponse({"status": "error", "message": "Invalid credentials"}, status=400)
        except Exception as e:
            return JsonResponse({"status": "error", "message": str(e)}, status=500)
    return JsonResponse({"status": "error", "message": "Invalid request method"}, status=405)

भाडेकरू-जागरूक योजना वापरून स्पष्ट टोकन व्यवस्थापन

मल्टी-टेनंट आर्किटेक्चरमध्ये लॉग इन करण्यासाठी मॉड्यूलराइज्ड आणि पुन्हा वापरण्यायोग्य Django API व्ह्यू.

सबडोमेन लॉगिन विनंत्या हाताळण्यासाठी फ्रंटएंड स्क्रिप्ट

भाडेकरू सबडोमेनसाठी फॉर्म सबमिशन आणि प्रक्रिया टोकन-आधारित लॉगिन हाताळण्यासाठी JavaScript उपाय.

<script>
document.querySelector('form').addEventListener('submit', function(event) {
    event.preventDefault();
    let form = event.target;
    let formData = new FormData(form);
    fetch("{% url 'tenant_aware_login' %}", {
        method: 'POST',
        body: JSON.stringify(Object.fromEntries(formData)),
        headers: {
            'Content-Type': 'application/json',
            'X-CSRFToken': formData.get('csrfmiddlewaretoken')
        }
    })
    .then(response => {
        if (!response.ok) throw new Error('Server Error');
        return response.json();
    })
    .then(data => {
        if (data.token) {
            localStorage.setItem('token', data.token);
            window.location.href = '/';
        } else {
            Swal.fire({
                icon: 'error',
                title: 'Login Failed',
                text: data.error || 'Invalid credentials'
            });
        }
    })
    .catch(error => {
        console.error('Error:', error);
    });
});
</script>

स्कीमा-अवेअर टोकन प्रमाणीकरण सत्यापित करण्यासाठी युनिट चाचणी

API स्कीमा स्विचिंग योग्यरित्या हाताळते याची खात्री करण्यासाठी Python मध्ये युनिट चाचणी.

from django.test import TestCase
from rest_framework.test import APIClient
from django_tenants.utils import schema_context
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
class TenantLoginTest(TestCase):
    def setUp(self):
        self.client = APIClient()
        with schema_context('test_tenant'):  # Switch to tenant schema
            self.user = User.objects.create_user(username='testuser', password='testpass')
    def test_successful_login(self):
        with schema_context('test_tenant'):
            response = self.client.post('/api/login/', {
                'username': 'testuser',
                'password': 'testpass'
            })
            self.assertEqual(response.status_code, 200)
            self.assertIn('token', response.json())
    def test_invalid_login(self):
        with schema_context('test_tenant'):
            response = self.client.post('/api/login/', {
                'username': 'wronguser',
                'password': 'wrongpass'
            })
            self.assertEqual(response.status_code, 401)
            self.assertIn('error', response.json())

मल्टी-टेनंट जँगो ॲप्समध्ये भाडेकरू-विशिष्ट टोकन प्रश्नांची भूमिका समजून घेणे

चा एक प्रमुख पैलू डेटाबेस ऑपरेशन्स नेहमी योग्य भाडेकरू स्कीमामध्ये होतात याची खात्री करत आहे. या प्रकरणात समस्या उद्भवते कारण जँगोचे डीफॉल्ट वर्तन एकच सामायिक स्कीमा गृहीत धरते, ज्यामुळे टोकन किंवा वापरकर्ते आढळू शकत नाहीत तेव्हा त्रुटी उद्भवतात . सारख्या साधनांचा फायदा घेऊन पासून कार्य जँगो-भाडेकरू लायब्ररी, आम्ही स्पष्टपणे भाडेकरू-विशिष्ट क्वेरी करण्यासाठी स्कीमा दरम्यान स्विच करतो. हे सुनिश्चित करते की वापरकर्त्यांसाठी प्रमाणीकरण क्वेरी आणि टोकन योग्य स्कीमाकडे निर्देशित केले जातात.

आणखी एक महत्त्वाचा तपशील म्हणजे कसे ऑपरेट करते. डीफॉल्टनुसार, ते सक्रिय डेटाबेस स्कीमामध्ये वापरकर्ता रेकॉर्ड शोधते. सध्याची स्कीमा चुकीची असल्यास, क्वेरी अ सह अयशस्वी होते त्रुटी याचे निराकरण करण्यासाठी, आम्ही खात्री करतो की टोकन मॉडेलचा समावेश असलेली कोणतीही क्वेरी योग्य भाडेकरू स्कीमा संदर्भामध्ये होते. या समायोजनाशिवाय, वैध वापरकर्ते देखील प्रमाणीकरण करण्यात अयशस्वी होतील कारण वापरकर्त्याचा आयडी डीफॉल्ट स्कीमामध्ये असू शकत नाही.

याव्यतिरिक्त, या बॅकएंड प्रक्रियांशी प्रभावीपणे संवाद साधण्यात फ्रंट-एंड कोड महत्त्वपूर्ण भूमिका बजावतो. फेच API पाठवते याची खात्री करणे आणि JSON प्रतिसाद योग्यरित्या हाताळणे महत्वाचे आहे. उदाहरणार्थ, ट्राय-कॅच ब्लॉक्समध्ये API कॉल गुंडाळणे आणि वापरकर्ता-अनुकूल लायब्ररी वापरून त्रुटी हाताळणे उपयोगिता सुधारते. उपडोमेन दरम्यान स्विच करताना किंवा स्कीमा-विशिष्ट त्रुटींचा सामना करत असतानाही, लॉगिन प्रवाह अखंड राहतो याची ही सुधारणा सुनिश्चित करतात. उदाहरणार्थ, एका SaaS प्लॅटफॉर्मची कल्पना करा जिथे प्रत्येक कंपनी (भाडेकरू) सबडोमेन वापरते — फिक्सिंग स्कीमा संदर्भ हे सुनिश्चित करते की प्रत्येक कर्मचारी कोणत्याही व्यत्ययाशिवाय सहजतेने लॉग इन करतो. 🚀

  1. कशामुळे अ लॉगिन दरम्यान?
  2. त्रुटी उद्भवते कारण चुकीच्या स्कीमाची चौकशी करते, ज्यामुळे वापरकर्ता नोंदी पाहताना जुळत नाही.
  3. टोकन क्वेरी योग्य भाडेकरू स्कीमा दर्शवितात याची मी खात्री कशी करू शकतो?
  4. वापरा पासून क्वेरी अंमलात आणण्यासाठी आणि योग्य स्कीमावर स्विच करण्यासाठी लायब्ररी.
  5. ॲडमिन पॅनेल लॉगिन का काम करते पण वापरकर्ता लॉगिन अयशस्वी का होते?
  6. Django प्रशासक आपोआप स्कीमा संदर्भ समायोजित करतो, परंतु सानुकूल दृश्ये वापरून किंवा स्पष्टपणे कॉन्फिगर केल्याशिवाय नाही.
  7. मी फ्रंटएंडवर लॉगिन टोकन कसे मिळवू आणि संचयित करू?
  8. क्रेडेन्शियल पाठवण्यासाठी fetch API वापरा, नंतर प्रतिसाद टोकन वापरून संग्रहित करा सतत प्रमाणीकरणासाठी.
  9. अयशस्वी लॉगिनसाठी मी चांगले त्रुटी संदेश कसे प्रदर्शित करू शकतो?
  10. सारख्या लायब्ररी वापरून फ्रंटएंड अलर्ट लागू करा चुकीची क्रेडेन्शियल किंवा सर्व्हर समस्या वापरकर्त्यांना सूचित करण्यासाठी.

Django मल्टी-टेनंट ॲप्समधील लॉगिन अपयशांचे निराकरण करण्यासाठी सर्व डेटाबेस क्वेरी योग्य स्कीमामध्ये कार्य करतात याची खात्री करणे आवश्यक आहे. स्कीमा संदर्भासारखी साधने स्पष्टपणे वापरून, स्कीमा विवाद टाळून, योग्य भाडेकरू डेटाबेसमधून वापरकर्ता टोकन प्राप्त केले जातील याची आम्ही हमी देऊ शकतो.

SaaS प्लॅटफॉर्मवर काम करण्याची कल्पना करा जिथे वापरकर्त्यांना फक्त सबडोमेनवर लॉगिन अपयशाचा सामना करावा लागतो. योग्य स्कीमा स्विचिंगसह, या समस्यांचे निराकरण केले जाते, अखंड प्रमाणीकरण सुनिश्चित करते. या निराकरणाचा अवलंब केल्याने केवळ सुधारणा होत नाही परंतु प्रत्येक भाडेकरूसाठी सुरक्षित, कार्यक्षम डेटा प्रवेशाची हमी देखील देते. 🔧

  1. वर तपशीलवार दस्तऐवजीकरण लायब्ररी, मल्टी-टेनंट ऍप्लिकेशन्समध्ये स्कीमा व्यवस्थापन स्पष्ट करते. येथे उपलब्ध: जँगो-भाडेकरू दस्तऐवजीकरण .
  2. टोकन प्रमाणीकरणावरील अधिकृत जँगो रेस्ट फ्रेमवर्क (DRF) दस्तऐवजीकरण. येथे अधिक जाणून घ्या: DRF टोकन प्रमाणीकरण .
  3. बहु-भाडेकरू वातावरणात schema_context वापरण्याबाबत सर्वसमावेशक मार्गदर्शक. येथे आढळले: GitHub - Django भाडेकरू .
  4. Django ऍप्लिकेशन्समध्ये CSRF टोकन हाताळण्यावरील अंतर्दृष्टी: जँगो सीएसआरएफ दस्तऐवजीकरण .
  5. वापरकर्ता प्रमाणीकरणासह, मल्टी-टेनंट SaaS प्लॅटफॉर्म डिझाइन करण्यासाठी सर्वोत्तम पद्धती: SaaS Pegasus मल्टी-टेनन्सी मार्गदर्शक .