2

Я использую Django Rest Framework в своем приложении Python и использую аутентификацию JNT для проверки подлинности веб-токена (DRF JWT) для аутентификации api.Проверка подлинности JWT не работает для настраиваемого контроллера в Django

Проблема возникает, когда я создаю пользовательский контроллер. Я указал конкретный URL-адрес функции в моем файле calculations.py, который я создал. Вот как они выглядят.

urls.py

from django.conf.urls import patterns, include, url 
from django.contrib import admin 
from rest_framework import routers 
from app.serializers import xxxViewSet, yyyViewSet 
from app.calculations import getReturns 

router = routers.DefaultRouter() 
router.register(r"xxx", xxxViewSet) 
router.register(r"yyy", yyyViewSet) 

urlpatterns = patterns('', 
url(r'^admin/', include(admin.site.urls)), 
url(r'^api/auth/token/$', 'rest_framework_jwt.views.obtain_jwt_token'), 
url(r'^api/auth/', include('rest_framework.urls', namespace='rest_framework')), 
url(r'^api-token-verify/', 'rest_framework_jwt.views.verify_jwt_token'), 
url(r'^api/', include(router.urls)), 
**url(r'^getReturns/', getReturns),** 
) 

calculations.py

from django.http import HttpResponse 
from .models import xxx, yyy, zzz, aaa 

def getReturns(request): 
    data = request.GET('data') 

    **running calculations here on data and giving out response** 

    return HttpResponse(response) 

serializers.py

from rest_framework.authentication import SessionAuthentication, BasicAuthentication 
from rest_framework import routers, serializers, viewsets, permissions 
from rest_framework_jwt.authentication import JSONWebTokenAuthentication 
from .models import xxx, yyy, zzz, aaa 

class xxxSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = xxx 
     fields = ('id', 'name') 

class xxxViewSet(viewsets.ModelViewSet): 
    authentication_classes = [SessionAuthentication, BasicAuthentication, JSONWebTokenAuthentication] 
    permission_classes = [permissions.IsAuthenticated, permissions.IsAdminUser] 
    queryset = xxx.objects.all() 
    serializer_class = xxxSerializer 

выше serializers.py файл содержит классы Serializer для всех моих моделей, а также viewsets для того же. Я еще не передал viewsets в views.py, так что теперь файл пуст.

В любом случае, мой calculations.py отделен от этих файлов, и функция, определенная в этом файле, непосредственно вызывается URL-адресом/getReturns /, не просматривая представление. Как включить функции, определенные в файле моих вычислений, в представление, чтобы мои классы полномочий вызывались до того, как функция будет выполнена?

ответ

4

Я начал делать это в комментариях, и это было слишком долго. Как правило, на самом деле вы не предоставили достаточный код для правильной поддержки, но в любом случае вот моя трещина. Неясно, какая версия/реализация Django JWT, которую вы используете (есть несколько), как вы авторизуете свои представления, или ваш файл calculate.py - это представление или что-то еще. (Если это что-то еще, я бы разрешил просмотр и назову его оттуда.)

Почему вы не можете отправить POST? Как правило, после того, как у вас есть токен в вашем интерфейсе, вы можете использовать обертку from rest_framework.decorators import authentication_classes и @authentication_classes([JSONWebTokenAuthentication,]) для любой функции, требующей авторизации.

Это выглядит следующим образом:

@authentication_classes([JSONWebTokenAuthentication,]) 
def function_here(arguments): 
    #function does stuff 

Как вы проходя/пытается отправить веб-маркер обратно в приложение?

Предположительно в CURL ваши первоначальные аутентификации, чтобы получить маркер выглядит примерно так: curl -X POST -d "username=admin&password=abc123 после этого вы получите (если вы используете rest_framework_jwt) маркер обратно: {JWTAuthorization: YourTokenHere}.

После этого, чтобы вернуть его в ФПИ защищенных страниц (при условии, что они обернуты, как описаны выше, или иметь подобную защиту) - Вы не указаны, как вы авторизация - then from the docs you do: curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/

Если вы вызываете вызов в угловом или подобном, то это то же самое - вам нужно передать его в заголовки.

Редактировать: Я также хотел бы отметить, что вы резко увеличили количество кода здесь с момента моего первоначального ответа. По сути, вам нужно проверить классы, которые вы объявляете; самый простой способ указан выше.

+0

Теперь я вижу, что я не представил всю необходимую информацию.Я использую это для JWT https://github.com/GetBlimp/django-rest-framework-jwt. 'calculate.py' содержит только одну единственную функцию, которую я поставил в вопросе' getReturns'. Я не обволакивал его в любом виде. Как вы можете видеть в файле 'url.py', я просто вызываю эту функцию и привязываю ее к URL-адресу. Должен ли я помещать это в представление в мой 'views.py'? Если да, то как мне это сделать и настроить его с помощью аутентификации? – srthu

+0

Я редактировал вопрос. Не могли бы вы сейчас взглянуть на него и ответить? – srthu

+0

Ответ все тот же, вам нужно использовать оболочку классов @authentication для функции, это в моем ответе. – Withnail

Смежные вопросы