मैंने एक लॉगिन फॉर्म के साथ एक मोडल किया और एक पोस्ट AJAX अनुरोध के माध्यम से सबमिट किया। मैं केवल एक बार लॉगिन कर सकता हूं, जब मैं लॉगआउट करता हूं और फिर से लॉगिन करने का प्रयास करता हूं तो AJAX अनुरोध का त्रुटि संदेश यह है (CSRF विफल):

Prohibido (403)
Verificación CSRF fallida. Solicitud abortada

लॉगिन केवल तभी काम करता है जब मैं F5 दबाकर पूरे पृष्ठ को रीफ्रेश करता हूं। लॉगिन पर सफलता के बाद मैं केवल हेडर को रिफ्रेश करता हूं, पूरे पेज को नहीं। मेरा रीफ्रेश कोड यह है:

$('#update-' + idToUpdate).load(' #' + idToUpdate);

संपादित करें: मैंने पाया कि CSRF टोकन सफलता के अनुरोध के बाद केवल एक बार काम करता है। फ़ॉर्म को फिर से काम करने के लिए मुझे एक नया टोकन जेनरेट करना होगा, और यह टोकन केवल तभी अपडेट होता है जब मैं F5 दबाकर पूरे पेज को रीफ्रेश करता हूं, और यही वह है जो मैं नहीं करना चाहता हूं।

इस समस्या का कोई समाधान? मैं सीएसआरएफ टोकन को अद्यतन करने के लिए AJAX अनुरोध नहीं करना चाहता, जो सुरक्षित नहीं है।

0
Jota 20 अगस्त 2017, 04:19

2 जवाब

सबसे बढ़िया उत्तर

मुझे एक समाधान मिला। सक्सेस रिक्वेस्ट के बाद मेरे फंक्शन $('#update-' + idToUpdate).load(' #' + idToUpdate); में सीएसआरएफ टोकन के साथ फॉर्म की सभी आईडी डालें। यह प्रपत्रों का आंशिक async F5 रीफ्रेश करता है, इसलिए सभी सीएसआरएफ टोकन अपडेट हो जाते हैं और मैं नए अनुरोध कर सकता हूं।

0
Jota 20 अगस्त 2017, 17:37

आप JS द्वारा ही CSRF टोकन जेनरेट कर सकते हैं:

// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
     }
     return cookieValue;
}
var csrftoken = getCookie('csrftoken');

हर बार जब आप फ़ंक्शन को कॉल करते हैं तो यह एक नया सीएसआरएफ टोकन बनाएगा और आपको पृष्ठ को रीफ्रेश करने की आवश्यकता नहीं होगी।

अधिक जानकारी के लिए देखें: https://docs.djangoproject.com/en /1.11/ref/csrf/#ajax

0
Sachiv Paruchuri 20 अगस्त 2017, 19:10