Вход с помощью API на основе токенов?

#django #api #authentication #django-rest-framework #http-token-authentication

#django #API #аутентификация #django-rest-framework #http-токен-аутентификация

Вопрос:

Я создаю веб-приложение Django с API, которое использует аутентификацию на основе токенов, а не на основе сеанса. API используется как интерфейсом веб-приложения, так и отдельным мобильным приложением. Мне трудно понять, как выполнить вход в систему. Моей первой мыслью было просто сделать то, что я планирую сделать в мобильном приложении: форма входа просто отправляется на конечную точку, которая создает и отправляет обратно токен доступа, затем токен доступа сохраняется в хранилище браузера / приложения для отправки вместе с будущими запросами. Кажется, это имеет смысл в контексте мобильного приложения, но в браузере это кажется странным. Одна из проблем этого подхода заключается в том, что внутренние страницы будут по-прежнему видны даже после выхода из системы. Пользователь может выйти из системы, затем нажать кнопку «Назад» и просто просматривать сайт. Даже если все вызовы API завершатся неудачей, их статический контент все равно будет обслуживаться.

Мне кажется, разница в том, что в мобильном приложении аутентификация необходима только для вызовов API, поскольку статический контент уже находится на устройстве и его не нужно извлекать. Однако в веб-приложении необходимо обслуживать статический контент, и, вероятно, этого не должно быть, если пользователь не вошел в систему.

Редко ли использовать аутентификацию только на основе токенов? Нужно ли мне использовать аутентификацию на основе сеанса для статического содержимого наряду с аутентификацией на основе токенов для API?

Как это обычно делается?

РЕДАКТИРОВАТЬ: я использую django-rest-framework, поэтому простой способ справиться с этим также был бы оценен.

Ответ №1:

Подключите свои вызовы JS API таким образом, чтобы сбои аутентификации перенаправляли текущую страницу обратно на страницу входа.

 $http({url: "/api/v1/thing"})
    .success(function(data, status, headers, config) {
        // Do something
    })
    .failure(function(data, status, headers, config) {
        if (status == 403) {
             window.location.href = "/login/?next=" window.location.href
        }
    })
  

Комментарии:

1. Это имеет смысл. Спасибо! Вы знаете, является ли это стандартной практикой?

2. Я не знаю, является ли это стандартной практикой. Мы выписываем приложения с использованием Angular, а корневая страница приложения защищена аутентификацией на основе сеанса. после входа на страницу для связи с API используется аутентификация токена. если пользователь выходит из системы по какой-либо причине, у нас установлен HTTP-перехватчик, который перехватывает 403 и 401 и выполняет соответствующие действия (перенаправление на вход в систему или отображение сообщения об отказе в разрешении).