JWT 身份验证不适用于 Django 中的自定义控制器
JWT authentication doesn't work for custom controller in Django
我在我的 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 调用,而不通过视图。如何将计算文件中定义的函数合并到视图集中,以便在函数执行之前调用我的授权 类?
我开始在评论中这样做,但它太长了。通常,您没有真正提供足够的代码来提供适当的帮助,但无论如何,这是我的破解方法。您正在使用哪个 version/implementation Django JWT(有几个),您如何授权您的视图,或者您的 calculations.py 文件是一个视图还是其他东西并不明显。 (如果是别的东西,我会在视图中授权,然后从那里调用它。)
为什么您无法发送 POST?一般来说,一旦你在前端有了令牌,你就可以在任何需要授权的函数上使用 from rest_framework.decorators import authentication_classes
和 @authentication_classes([JSONWebTokenAuthentication,])
包装器。
看起来像这样:
@authentication_classes([JSONWebTokenAuthentication,])
def function_here(arguments):
#function does stuff
您如何 passing/trying 将 Web 令牌发送回应用程序?
大概在 CURL 中,您获得令牌的初始身份验证类似于:
curl -X POST -d "username=admin&password=abc123
之后你得到(如果你使用 rest_framework_jwt
)令牌:
{JWTAuthorization: YourTokenHere}
。
在那之后,return 它到 DRF 保护页面(假设它们被包装,如上所述,或有类似的保护)- 你还没有概述你是如何授权的 - then from the docs you do:
curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
如果您在 Angular 或类似的地方生成调用,那么它是一样的 - 您需要在 headers 中传递它。
编辑:我还注意到,自从我最初的回答以来,您已经大大增加了此处的代码量。不过,从根本上讲,您需要检查您声明的身份验证 类;最简单的方法是如上所述。
我在我的 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 调用,而不通过视图。如何将计算文件中定义的函数合并到视图集中,以便在函数执行之前调用我的授权 类?
我开始在评论中这样做,但它太长了。通常,您没有真正提供足够的代码来提供适当的帮助,但无论如何,这是我的破解方法。您正在使用哪个 version/implementation Django JWT(有几个),您如何授权您的视图,或者您的 calculations.py 文件是一个视图还是其他东西并不明显。 (如果是别的东西,我会在视图中授权,然后从那里调用它。)
为什么您无法发送 POST?一般来说,一旦你在前端有了令牌,你就可以在任何需要授权的函数上使用 from rest_framework.decorators import authentication_classes
和 @authentication_classes([JSONWebTokenAuthentication,])
包装器。
看起来像这样:
@authentication_classes([JSONWebTokenAuthentication,])
def function_here(arguments):
#function does stuff
您如何 passing/trying 将 Web 令牌发送回应用程序?
大概在 CURL 中,您获得令牌的初始身份验证类似于:
curl -X POST -d "username=admin&password=abc123
之后你得到(如果你使用 rest_framework_jwt
)令牌:
{JWTAuthorization: YourTokenHere}
。
在那之后,return 它到 DRF 保护页面(假设它们被包装,如上所述,或有类似的保护)- 你还没有概述你是如何授权的 - then from the docs you do:
curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
如果您在 Angular 或类似的地方生成调用,那么它是一样的 - 您需要在 headers 中传递它。
编辑:我还注意到,自从我最初的回答以来,您已经大大增加了此处的代码量。不过,从根本上讲,您需要检查您声明的身份验证 类;最简单的方法是如上所述。