2015-12-17 10 views
5

मैं अपने ऐप में प्रमाणीकरण के लिए django-rest-jwt का उपयोग कर रहा हूं।Django Rest JWT लॉगिन?

डिफ़ॉल्ट यह उपयोगकर्ता उपयोगकर्ता नाम क्षेत्र से एक उपयोगकर्ता autenticate लिए, लेकिन मैं उन ईमेल या उपयोगकर्ता नाम का उपयोग कर लॉगिन करते हैं चाहते हैं।

क्या यह पूरा करने के लिए django-rest-jwt द्वारा समर्थित कोई मतलब है। मुझे पता है कि आखिरी विकल्प मेरी खुद की लॉगिन विधि लिखेगा।

उत्तर

0

एक कामकाज मिला।

@permission_classes((permissions.AllowAny,)) 
def signin_jwt_wrapped(request, *args, **kwargs): 
    request_data = request.data 
    host = request.get_host() 
    username_or_email = request_data['username'] 
    if isEmail(username_or_email): 
     # get the username for this email by model lookup 
     username = Profile.get_username_from_email(username_or_email) 
     if username is None: 
      response_text = {"non_field_errors":["Unable to login with provided credentials."]} 
      return JSONResponse(response_text, status=status.HTTP_400_BAD_REQUEST) 
    else: 
     username = username_or_email 

    data = {'username': username, 'password':request_data['password']} 
    headers = {'content-type': 'application/json'} 
    url = 'http://' + host + '/user/signin_jwt/' 
    response = requests.post(url,data=dumps(data), headers=headers) 

    return JSONResponse(loads(response.text), status=response.status_code) 

मैं जांचता हूं कि मुझे प्राप्त पाठ एक उपयोगकर्ता नाम या ईमेल है या नहीं।

ईमेल तो मुझे लगता है कि के लिए उपयोगकर्ता नाम देखने और फिर बस एक कस्टम प्रमाणीकरण बैकएंड या कस्टम प्रवेश विधि लिखने के लिए कोई ज़रूरत नहीं /signin_jwt/

6

है कि गुजरती हैं।

एक कस्टम सीरियलाइज़र जो JSONWebTokenSerializer को विरासत में रखता है, 'username_field' का नाम बदलता है और def मान्य() विधि ओवरराइड करता है।

यह 'username_or_email' और 'पासवर्ड' फ़ील्ड के लिए पूरी तरह से काम करता है जहां उपयोगकर्ता अपना उपयोगकर्ता नाम या ईमेल दर्ज कर सकता है और सही क्रेडेंशियल के लिए JSONWebToken प्राप्त कर सकता है।

class CustomJWTSerializer(JSONWebTokenSerializer): 
    username_field = 'username_or_email' 

def validate(self, attrs): 

    password = attrs.get("password") 
    user_obj = User.objects.filter(email=attrs.get("username_or_email")).first() or User.objects.filter(username=attrs.get("username_or_email")).first() 
     if user_obj is not None: 
      credentials = { 
       'username':user_obj.username, 
       'password': password 
      } 
      if all(credentials.values()): 
       user = authenticate(**credentials) 
       if user: 
        if not user.is_active: 
         msg = _('User account is disabled.') 
         raise serializers.ValidationError(msg) 

        payload = jwt_payload_handler(user) 

        return { 
         'token': jwt_encode_handler(payload), 
         'user': user 
        } 
       else: 
        msg = _('Unable to log in with provided credentials.') 
        raise serializers.ValidationError(msg) 

      else: 
       msg = _('Must include "{username_field}" and "password".') 
       msg = msg.format(username_field=self.username_field) 
       raise serializers.ValidationError(msg) 

     else: 
      msg = _('Account with this email/username does not exists') 
      raise serializers.ValidationError(msg) 

urls.py में:

url(r'{Your url name}$', ObtainJSONWebToken.as_view(serializer_class=CustomJWTSerializer)), 
+1

अच्छी तरह से किया @ शिखर-थपलियाल –

+0

@OhadtheLad धन्यवाद :) –