我试图让这个工作,但不知道这是否可能。它应该这样做。
Django
我使用++开发了一个 Web 应用程序Rest-Framework
,jQuery
并且我希望有一个外部应用程序来使用相同的REST
API,JWT Tokens
用于身份验证。
我现在的配置是这样的。
设置.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
'DEFAULT_RENDERER_CLASS': [
'rest_framework.renderers.JSONRenderer',
]
}
SIMPLE_JWT = {
'AUTH_HEADER_TYPES': ('Bearer',),
}
视图.py
class ListFileView(APIView):
permission_classes = (IsAuthenticated,)
def get(self, request, *args, **kwargs):
user = request.user
if user:
obj = Foo.objects.filter(owner=user)
serializer = FooSerializer(obj, many=True)
data = serializer.data
return Response(data, status=status.HTTP_200_OK)
return Response({'detail': 'You have no access to files.'}, status=status.HTTP_400_BAD_REQUEST)
棘手的部分是当我使用时:
permission_classes = (IsAuthenticated,)
我可以执行ajax
来自外部应用程序的调用(使用有效的JWT
令牌),但jQuery
来自应用程序内部的调用(使用经过身份验证的用户)失败并显示:
{"detail":"Authentication credentials were not provided."}
另一方面,如果我使用autentication_classes
而不是permission_classes
:
authentication_classes = (SessionAuthentication, BasicAuthentication)
我可以使用从 Web 应用程序中执行 ajax 调用jQuery
,但外部调用失败并出现相同的403
错误。
我尝试像这样使用两者:
class ListFileView(APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
def get(self, request, *args, **kwargs):
...
但外部呼叫也被拒绝。
是否可以让这两种类型Auth
在同一个class
视图中一起工作,或者我应该分成两个端点?
编辑
来自应用程序内部的示例调用jQuery
:
<script type="text/javascript">
function loadTblDocs() {
$("#tbl-docs > tbody").empty();
$.ajaxSetup({
headers: { "X-CSRFToken": '{{csrf_token}}' }
});
$.ajax({
type: 'GET',
contentType: "application/json; charset=utf-8",
url: "/api/list/",
dataType: "json",
success: function (data) {
console.log(data);
}
});
};
</script>
VBA
并通过代码在外部:
Set web = CreateObject("WinHttp.WinHttpRequest.5.1")
web.Open "GET", "/api/list/", False
web.SetRequestHeader "Authorization", "Bearer <JWT_TOKEN_HERE>"
web.Send