После того, как задаю вопрос в стеке переполнения, кстати, не находя ответ, а скорее вопросы о том, почему я сделал так, я видел, что я не единственный, кто имел этот подход.
До сих пор никто не обращался к этому вопросу, как защитить запросы Get или Post в Django, Ajax, JS Только этот сайт может использовать его никто другой
Кто-то задал этот вопрос, и это был мой ответ:
Они всегда рекомендуют «JWT, токен аутентификацию и аутентификацию сеанса» и т. Д. Но все эти решения требуют зарегистрированного пользователем, и что произойдет, если я хочу защитить поисковый автозаполнение или что-либо что-либо на предельном положении.
Я создал отдохнуть каркасным разрешением на заказ, а я использую Django CSRFMiddleWaretoken:
Это ведет себя так же, как форма Post Django, промежуточное программное обеспечение Token CSRF Отправить тип ввода, скрытый с помощью # {% csrf_token%}
(вход спрятан с токеном) Но и этот случай требует только # {{csrf_token}}
(токен), Django сравнивает токен запроса с токеном cookie, который зашифрован
permission.py from django.middleware.csrf import _compare_salted_tokens, rotate_token from rest_framework.permissions import BasePermission class HasCsrfTokenValid(BasePermission): def has_permission(self, request, view): token_valid = False try: csrf_token = request.headers.get("api-csrftoken") csrf_cookie = request.META.get("CSRF_COOKIE") """ Check if both alphanumerics(strings) values are differents to prevent a malicious user get the csrf cookie and send it from the ajax. """ if csrf_token == csrf_cookie: rotate_token(request) return False token_valid = _compare_salted_tokens(csrf_token, csrf_cookie) except ValueError: # if csrf_token & csrf_cookie are not a valid alphanumeric return False return token_valid
Добавить разрешение класс на вид API
#views.py class SnippetSearchAPI(generics.ListAPIView): model = Snippet serializer_class = SnippetSearcSerializer permission_classes = [HasCsrfTokenValid,] queryset = Snippet.objects.all()
//Ajax request: $('#search-snippet').keyup(function () { $.ajax({ url:"{% url 'snippet-search-space:api' %}", headers:{'api-csrftoken':'{{ csrf_token }}'}, success:function(data){ console.log(data) } }); });
вывод:
Пока что я решил это, но я не знаю последствий безопасности на будущее, я попробовал это, и это кажется безопасным. Но всегда будет кто-то там, кто может взломать это, по крайней мере, я так думаю.
Как вы думаете?
Оригинал: “https://dev.to/agenteand/how-to-set-token-authentication-via-ajax-in-django-to-secure-the-api-url-1fn1”