2017-02-16 1 views
0

목표는 obtain_jwt_token을 오버라이드하여 프로 시저의 반환 값을보다 효율적으로 제어하고 doc에서이 작업을 수행하는 방법에 대한 기괴하고 간략한 정보 만 발견했습니다. :Django 토큰 권한 부여 - ObtainAuthToken 클래스를 오버라이드하여 obtain_jwt_token 사용자 정의

참고 기본 obtain_auth_token보기는 명시 적으로 JSON을 오히려 디폴트의 렌더링 및 파서 설정에 클래스를 사용하는 것보다 요청과 응답을 사용. 당신이 obtain_auth_token보기의 사용자 정의 버전을해야하는 경우가 ObtainAuthToken보기 클래스를 무시하고 URL의 conf 대신

지금으로

에 그를 사용하여 수행 할 수 있습니다, 내 시도는 다음과 같습니다

urlpatterns = [ 
    url(r'^api-token-auth/', my_customized_view), 
] 

class Foo(ObtainAuthToken): 
    def post(self): 
     # here goes my customized code 

my_customized_view = Foo.as_view() 

확률은 내 코드가 매우 어리석은 것처럼 보입니다. 나는 Djagno에서 약간의 경험이 있으므로, 이것으로 나를 도와주세요!

+0

나는 당신이하려는 것을 정확하게 이해하지 못합니다. 어쩌면 당신이 당신의 목표와 실제 코드의 더 좋은 예를 가지고 있다면. JWT의 경우 http://getblimp.github.io/django-rest-framework-jwt/를 사용하면 jwt 응답을 아주 쉽게 사용자 정의 할 수 있습니다. –

+0

맞다면 몇 가지 기준에 따라 토큰을 반환하도록 사용자 정의하려고합니다. 무작위 추측. –

답변

0

저는 사용자를 돌려 주길 원했고 전자 메일이나 사용자 이름 로그인도 허용하기 위해 동일한 여행을했습니다. 문서가 완전히 명확하지는 않지만 인증 토큰에 대해 설명한 것처럼 JWT에서도 동일한 작업을 수행 할 수 있습니다. obtain_jwt_token은 JSONWebToken을 획득하므로 obtain_auth_token은 ObtainAuthToken을 가져옵니다. 이 내 덮어 로그인 방법 :

from django.contrib.auth.models import User 
from api.serializers import UserSerializer 
from rest_framework.response import Response 
from rest_framework import status 
from rest_framework_jwt.settings import api_settings 
from rest_framework_jwt.views import ObtainJSONWebToken 

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER 
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER 
jwt_decode_handler = api_settings.JWT_DECODE_HANDLER 


class LoginView(ObtainJSONWebToken): 
def post(self, request, *args, **kwargs): 
    # by default attempts username/passsword combination 
    response = super(LoginView, self).post(request, *args, **kwargs) 
    # token = response.data['token'] # don't use this to prevent errors 
    # below will return null, but not an error, if not found :) 
    res = response.data 
    token = res.get('token') 

    # token ok, get user 
    if token: 
     user = jwt_decode_handler(token) # aleady json - don't serialize 
    else: # if none, try auth by email 
     req = request.data # try and find email in request 
     email = req.get('email') 
     password = req.get('password') 
     username = req.get('username') 

     if email is None or password is None: 
      return Response({'success': False, 
          'message': 'Missing or incorrect credentials', 
          'data': req}, 
          status=status.HTTP_400_BAD_REQUEST) 

     # email exists in request, try to find user 
     try: 
      user = User.objects.get(email=email) 
     except: 
      return Response({'success': False, 
          'message': 'User not found', 
          'data': req}, 
          status=status.HTTP_404_NOT_FOUND) 

     if not user.check_password(password): 
      return Response({'success': False, 
          'message': 'Incorrect password', 
          'data': req}, 
          status=status.HTTP_403_FORBIDDEN) 

     # make token from user found by email 
     payload = jwt_payload_handler(user) 
     token = jwt_encode_handler(payload) 
     user = UserSerializer(user).data 

    return Response({'success': True, 
        'message': 'Successfully logged in', 
        'token': token, 
        'user': user}, 
        status=status.HTTP_200_OK) 

당신은 당신이 경우하시기 바랍니다 장고의 인증 모델을 사용자 정의하여 이메일로 확인하는 기본값을 변경할 수 있지만, 나는 두 가지 옵션을 가지고 행복했다.

API 상용구를 만들기 시작했습니다. require.txt 파일과 config.example.py 파일은 나머지를보기 위해 아래로 당기기를 원하는 사람들을위한 것이다. https://github.com/garyburgmann/django-api-boilerplate

관련 문제