मैं प्रमाणीकरण के लिए Django बाकी फ्रेमवर्क और django-rest-framework-simplejwt का उपयोग कर रहा हूं। भेजा जा रहा डेटा प्रतिक्रिया द्वारा खपत किया जा रहा है।

अब तक मैं लॉग इन/नया टोकन प्राप्त करते समय उपयोगकर्ता नाम और आईडी दोनों को वापस करने के लिए TokenObtainPairSerializer को उप-वर्ग करने में सक्षम हूं।

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super(MyTokenObtainPairSerializer, self).validate(attrs)

        data.update({'user': self.user.username})
        data.update({'id': self.user.id})

        return data

जब टोकन रीफ्रेश किया जाता है तो मैं उपयोगकर्ता उपयोगकर्ता नाम और आईडी वापस करने की कोशिश कर रहा हूं। हालांकि, यह काम नहीं करता है:

class MyTokenRefreshSerializer(TokenRefreshSerializer):

    def validate(self, attrs):
        data = super(MyTokenRefreshSerializer, self).validate(attrs)
        user = self.context['request'].user
        data.update({'user': user.username})
        data.update({'id': user.id})

        return data  

यहां, उपयोगकर्ता नाम हमेशा एक खाली स्ट्रिंग के रूप में लौटाया जाता है और आईडी हमेशा शून्य के रूप में वापस आती है।

मैंने कई अलग-अलग तरीकों की कोशिश की है, जिसमें इस जानकारी को दृश्य में ही अपडेट करने का प्रयास करना शामिल है, लेकिन यह काम करने के लिए प्रतीत नहीं होता है। मैंने देखा है कि TokenRefreshSerializer उपवर्ग serializers.Serializer जबकि TokenObtainPairSerializer उपवर्ग TokenObtainSerializer जो स्वयं Django प्रमाणीकरण का उपयोग करके उपयोगकर्ता को प्रमाणित करता है। ऐसा लगता है कि एक पासवर्ड की आवश्यकता है (जैसे कि जब कोई उपयोगकर्ता लॉग इन करता है) लेकिन जाहिर है कि टोकन को रीफ्रेश करते समय प्रदान नहीं किया जाएगा।

मेरा प्रश्न यह है कि टोकन रीफ्रेश होने पर मैं वर्तमान उपयोगकर्ता के बारे में उपयोगकर्ता नाम और आईडी (या कोई मनमानी जानकारी) कैसे वापस कर सकता हूं?

फॉलो-ऑन प्रश्न यह होगा कि क्या उपयोगकर्ता द्वारा पहली बार लॉग इन करने पर उस जानकारी को सामने वाले छोर पर लोकलस्टोरेज में सहेजना अधिक व्यावहारिक है और राज्य को प्रत्येक बाद की यात्रा पर उस डेटा को फिर से पॉप्युलेट करना है (जब तक कि उपयोगकर्ता लॉग आउट नहीं करता है, या ताज़ा टोकन अब मान्य नहीं है)?

कृपया ध्यान दें: यह यह एक, क्योंकि मैं टोकन के रीफ्रेशिंग को लक्षित कर रहा हूं। प्रारंभिक TokenObtainPairView उपवर्ग और कार्यान्वयन के लिए सीधा था।

3
Hanzy 10 अप्रैल 2020, 18:42

1 उत्तर

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

चूंकि रीफ्रेश टोकन एंडपॉइंट प्रमाणीकृत अनुमति सेट नहीं करता है, इसलिए उपयोगकर्ता जानकारी प्राप्त करने के लिए आपके पास केवल रीफ्रेश टोकन है। तो मुझे नहीं लगता कि टोकन को डीकोड करने और डेटा प्राप्त करने के अलावा कोई अन्य तरीका है। आप शायद बैकएंड में डिकोडिंग कर सकते हैं, जो स्वचालित रूप से आपके अनुवर्ती प्रश्न का उत्तर देता है (हां आपको चाहिए) क्या आपको स्थानीय स्टोरेज पर उपयोगकर्ता जानकारी सहेजनी चाहिए और बाद में हिट के साथ एक संरक्षित एपीआई पर रीफ्रेश करना चाहिए जो अनुरोध के रूप में एक्सेस टोकन का उपयोग करता है। अब सेट हो जाएगा और कुछ उपयोगकर्ता अपडेट होने पर आप उपयोगकर्ता डेटा प्राप्त कर सकते हैं और अपने स्थानीय स्टोरेज को रीफ्रेश कर सकते हैं।

2
dipen bhatt 11 अप्रैल 2020, 12:40