JWT身份验证不适用于Django中的自定义控制器

时间:2015-06-12 06:38:49

标签: django authentication django-rest-framework json-web-token

我在我的Python应用程序中使用Django Rest Framework,并使用JSON Web令牌认证(DRF JWT)进行api身份验证。

当我构建自定义控制器时,我的问题出现了。我将一个特定的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文件包含我所有模型的序列化程序类,以及相同的视图集。我尚未将视图集转移到views.py,因此该文件暂时为空。

无论如何,我的calculations.py与这些文件是分开的,并且此文件中定义的函数直接由'/ getReturns /'URL调用,而不通过视图。如何将计算文件中定义的函数合并到视图集中,以便在函数执行之前调用我的授权类?

1 个答案:

答案 0 :(得分: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 

您如何传递/尝试将Web令牌发送回应用程序?

据推测,在CURL中,获取令牌的初始身份验证如下所示: curl -X POST -d "username=admin&password=abc123 之后你会得到(如果你正在使用rest_framework_jwt)令牌: {JWTAuthorization: YourTokenHere}

之后,要将其返回到受DRF保护的页面(假设它们已被包裹,如上所述,或具有类似的保护) - 您还没有概述您的授权方式 - {{3 }}: curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/

如果您以Angular或类似方式生成呼叫,那么它也是相同的 - 您需要在标头中传递它。

编辑:我还注意到,自从我的原始答案以来,您已大幅增加了此处的代码数量。从根本上说,你需要检查你宣布的auth课程;最简单的方法如上所述。