2017-02-24 8 views
1

は、私は私のカスタム認証をテストするためにhttpieを使用していジャンゴ:「non_field_errors」:?「提供された資格情報を使用してログインすることができません

http POST http://127.0.0.1:8000/api-token-auth/ username='username1' password='Password123' 

私はAbstractUserを使用してカスタム認証オブジェクトを作成しました。

はTokenAuthenticationを使用して、私はドキュメントに続いて、私のREST_FRAMEWORK設定で私のカスタムTokenAuthenticationを追加しました:

REST_FRAMEWORK = { 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'regis.models.CustomAuthentication', 
    ) 
} 

インストールしたアプリにrest_framework.authtokenを追加しました。

次のように私のAUTHENTICATION_BACKENDがある:

AUTHENTICATION_BACKENDS = [ 'regis.models.CustomAuthentication' ] 

そして、ここでは私のカスタム認証クラスです:

class CustomAuthentication(authentication.TokenAuthentication): 
    def authenticate(self, request): 
     username = request.META.get('X_USERNAME') 
     print(username) 
     user_model = get_user_model() 
     if not username: 
      return None 
    try: 
     user = user_model.objects.get(username=username) 
    except User.DoesNotExist: 
     raise exceptions.AuthenticationFailed('No such user') 
    return (user, None) 

はurls.py:

urlpatterns += [ 
    url(r'^api-token-auth/', views.obtain_auth_token), 

    ] 

私はかなり、次のよDRFドキュメント(http://www.django-rest-framework.org/api-guide/authentication/#custom-authentication)。これを解決するために必要な追加情報がある場合は、私に知らせてください、私は更新します。私が逃していることについての助けは素晴らしいだろう。

追加する:私はカスタムユーザーがいる場合、カスタム認証システムを作成する必要がありますか?

UPDATE:

私は上記のクラスを削除し、ちょうど私REST_FRAMEWORK設定でrest_framework.authentication.TokenAuthenticationを追加しました。私はまだ私のユーザーをフェッチするカスタム認証を使用しています。

それは、この(それをフォーマットするつもりはないSO VIMからコードをフォーマットで吸う。)のようになります。私はそのコードを作成するには、このDjangoのドキュメントを使用

class CustomAuthentication(object): 
def authenticate(self, email=None, password=None): 

    User = get_user_model() 
    try: 
     user = User.objects.get(email=email) 
    except User.DoesNotExist: 
     return None 
    if user.check_password(password): 
     return user 

    return None 

def get_user(self, user_id): 
    try: 
     user_model = get_user_model() 
     user = user_model.objects.get(pk=user_id) 
    except User.DoesNotExist: 
     return None 

https://docs.djangoproject.com/en/1.10/topics/auth/customizing/

+0

あなたの好奇心に答えるには:いいえ、カスタムユーザーを使用している場合、カスタム認証は必要ありません。職場で使用するビルドにはカスタムユーザがあり、Djangoに同梱されているデフォルトのModelBackendを使用します。 :) – Neelik

+0

@Neelik ayyyeeは仕事をそこに繋ぐ! –

+0

会社が少し成長したときに:P私たちは今でもまだ少しローカルグループです。 – Neelik

答えて

0

OK私はそれを解決しました。私の設定の中で、私はAUTHENTICATIONS_BACKENDを削除するだけでした。私は私のカスタムバックエンドが単にユーザーをログインさせるために異なっていると思っていました。そして、トークン認証バックエンドがそのトークンを取得するために働いていました。

1

あなたが検索する場合あなたはauthtoken/serializers.pyで(これを見つけるDRFコード内のエラー文字列、:

from django.contrib.auth import authenticate 
... 

if username and password:                                                    
    user = authenticate(username=username, password=password)                                           

    if user:                                                       
     # From Django 1.10 onwards the `authenticate` call simply                                          
     # returns `None` for is_active=False users.                                              
     # (Assuming the default `ModelBackend` authentication backend.)                                         
     if not user.is_active:                                                   
      msg = _('User account is disabled.')                                              
      raise serializers.ValidationError(msg, code='authorization') 
    else:                                                      
     msg = _('Unable to log in with provided credentials.')                                           
     raise serializers.ValidationError(msg, code='authorization') 
... 

だからそれはどちらか、あなたが使っているのDjangoのバージョンに応じて、これらのように見えます(Django> = 1.10の場合)ユーザーがアクティブではありませんか?

これらの認証情報を使用して管理者で手動でログインしようとしましたか?

+0

私はiOS開発を行っており、ログインには電子メールとパスワードを使用しています。私はシェルに行き、ユーザーのユーザー名を照会したが正しい。私はちょうどユーザーがアクティブであるかどうかをチェックし、「真」と表示します。私の質問にすべてのものが正しいのか、それとも気づいていないものが欠けていますか? –

+0

btw、はい私はDjango 1.10.2を使用しています –

+0

ユーザーが既に認証されている場合はどうなりますか? –

関連する問題