2017-02-16 4 views
0

Моя цель - переопределить obtain_jwt_token, чтобы получить больше контроля над возвращаемым значением процедуры, а в doc я нашел только странную и отрывочную информацию о том, как это сделать :авторизация denang Django - настройка get_jwt_token путем переопределения класса ObtainAuthToken

Обратите внимание, что obtain_auth_token вид по умолчанию явно использует JSON запросы и ответы, а не с использованием визуализации по умолчанию и анализатор классы в ваших настройках. Если вам нужна настроенная версия obtain_auth_token зрения, вы можете сделать это, перекрывая ObtainAuthToken вида класса, и с помощью этого в своем адрес конфе вместо

На данный момент, моя попытка выглядит следующим образом:

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() 

Скорее всего, мой код выглядит довольно глупым, и я просто потерялся, пытаясь его Google. У меня мало опыта в Djagno, поэтому, пожалуйста, помогите мне с этим!

+0

Я не совсем понимаю, что вы пытаетесь сделать. Возможно, если бы у вас был лучший пример ваших целей и фактического кода. Для JWT я использую http://getblimp.github.io/django-rest-framework-jwt/, который отлично работает и очень легко настроить ответ jwt. –

+0

Если я прав, вы пытаетесь настроить возврат маркера на основе некоторых критериев. Случайный Угадай. –

ответ

0

Я только что проходил через одно путешествие для понимания, поскольку я хотел вернуть пользователя, а также разрешить электронную почту или имя пользователя. Документация не совсем ясна, но, как описано для токена auth, вы можете сделать то же самое для JWT. get_auth_token - ObtainAuthToken, так как get_jwt_token должен получить JSONWebToken. Это мой переписывается метод Логин:

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) 

Вы можете изменить настройки по умолчанию для проверки только по электронной почте, если вам угодно, настроив модель аутентификации Django, но я был рад, что оба варианта.

Я начал создавать шаблон api. Существует файл требований.txt и файл config.example.py для всех, кто хочет вытащить его, чтобы просмотреть остальные. https://github.com/garyburgmann/django-api-boilerplate