Я пытаюсь заставить это работать, но не знаю, возможно ли это.Это должно быть сделано так.
Я разработал веб-приложение, используя Django
+ Rest-Framework
+ jQuery
, и я хочу, чтобы внешнее приложение использовало тот же API REST
, используяJWT Tokens
для аутентификации.
Моя текущая конфигурация такая:
settings.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',),
}
views.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)
Я могу выполнять ajax-вызовы из веб-приложения, используя jQuery
, но внешние вызовы завершаются с той же ошибкой 403
.
Я пытался использовать оба варианта так:
class ListFileView(APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
def get(self, request, *args, **kwargs):
...
, но внешние вызовы также отклоняются.
Возможно ли совместить эти два типа Auth
в одном представлении class
или я должен разделитьe на две конечные точки?
РЕДАКТИРОВАТЬ
Пример вызовов из приложения с помощью 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