Рубрики
Без рубрики

Как установить аутентификацию Token через AJAX в Django, чтобы закрепить URL API

После того, как задал вопрос в переполнении стека, кстати, не находя ответ, а скорее вопросы … помечены Python, Django, DjangorestFramework, Безопасность.

После того, как задаю вопрос в стеке переполнения, кстати, не находя ответ, а скорее вопросы о том, почему я сделал так, я видел, что я не единственный, кто имел этот подход.

До сих пор никто не обращался к этому вопросу, как защитить запросы 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”