2015-12-17 11 views
5

私はdjango-rest-jwtを私のアプリケーションの認証に使用しています。ユーザー名またはメールアドレスを使用してDjango Rest JWTログインしますか?

デフォルトでは、ユーザーのユーザー名フィールドはユーザーを認証しますが、ユーザーにはの電子メールまたはユーザー名を使用してログインさせる必要があります。

これを達成するために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 validate()メソッドをオーバーライドするカスタムシリアライザ。

これは完全に 'username_or_email'フィールドと 'password'フィールドで動作し、ユーザーはユーザー名またはメールアドレスを入力して、正しい資格情報を得るためにJSONWebTokenを取得できます。 urls.pyで

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) 

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

うまく行わ@ shikhar-thapliyal –

+0

@OhadtheLad感謝:) –

関連する問題