2017-08-22 8 views
1

私のAPIサービスのユーザー登録には苦労しています。私は方法をチェックしましたし、すべてが、有効ですが、ユーザ登録データをPOST'ingとき、私はまだエラーコードを受信Djangoはユーザー登録のために権限デコレータをバイパスし、認証を要求します

エラーコード:私は「

{"details": "Authentication credentials not provided"} 

Settings.py

フレームワーク

REST_FRAMEWORK = { 
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated', 
    ), 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication', 
    'rest_framework.authentication.BasicAuthentication', 
) 
} 

現在機能している唯一のものに基本認証、およびにisAuthenticated TokenAuthenticationを追加しまし既存のユーザーのトークンを取得する:

Urls.py Url.pyで

url(r'^auth/', views.obtain_auth_token, name='get_auth_token'), 

他のエンドポイント

url(r'^login/', Login.as_view(), name='login'), 
url(r'^register/', Register.as_view(), name='signup'), 

私は、ユーザー登録のためのベストプラクティスを使用したり準備していないよ信じます私はログインとサインアップを混同しています。よく分かりません。 Views.py

queryset = User.objects.all() 
serializer_class = UserSerializer 

@api_view(['POST', ]) 
def login(request): 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 

    if user is not None: 
     if user.is_active: 
      login(request, user) 
      return Response({"success": "User was successfully logged on."},) 
     else: 
      return Response({"error": "Login failed, bad request."},) 
    else: 
     return Response({"error": "Login failed, invalid username or password"}, status=status.HTTP_401_UNAUTHORIZED) 

でViews.py

# Register User 

class Register(APIView): 

queryset = User.objects.all() 
serializer_class = UserSerializer 
# permission_classes = [permissions.IsAuthenticated] 

@permission_classes([permissions.IsAuthenticated, ]) 
@api_view(['POST', ]) 
def register_user(self, request, *args, **kwargs): 
    serializer = UserSerializer(data=request.data) 
    if serializer.is_valid(): 
     self.perform_create(serializer) # serializer.save() 
     headers = self.get_success_headers(serializer.data) 
     token, created = Token.objects.get_or_create(user=serializer.instance) 
     return Response({'token': token.key, 'id': serializer.instance.id}, status=status.HTTP_201_CREATED, headers=headers) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

ログインユーザ方法で

登録ユーザー方式は、すべてのヘルプはが大幅いただければ幸いです。ありがとうございました!

+0

あなたのリクエストで 'Token'と' Authorization'ヘッダを渡していますか? – wencakisa

+0

私はDjango Rest Frameworkについてよく分かりませんが、レジスタビューに 'permissions.IsAuthenticated'があれば、すでに認証されているユーザだけがアクセスできるようになります。登録できる?) –

+0

@wencakisaあなたはそれを明確にすることができますか?登録するにはトークンは必要ありません。 –

答えて

3

DRFの設定では、すべてのビューのデフォルトのアクセス許可クラスの1つがIsAuthenticatedになります。あなたが問題を抱えているビューは、トークンがないとき(そしてそうでなければならないとき)にトークンがDRFでチェックされた結果です。これらのビューのアクセス許可クラスを明示的に消去してみてください:@permission_classes([])

理由obtain_auth_tokenが働いている:https://github.com/encode/django-rest-framework/blob/master/rest_framework/authtoken/views.py#L10

+0

でも、同じエラーコードが表示されています。このように: '@permission_classes([]) @api_view(['POST'、]) def register_user(自己、リクエスト、* args、** kwargs):'? –

+1

デコレータの順序を逆にしてみてください – mindcruzer

+0

さようなら!認証の詳細に関するエラーはもう発生しません。 '' detail ': "メソッド\" POST \ "は許可されていません" "これは私が推測しているapi_viewデコレータの問題とほとんど同じですか? –

関連する問題