2015-11-11 3 views
0

Я использую Django v1.8 и django-rest-framework v3.2.2. У меня есть сайт с API с открытым доступом, который также используется моим собственным сайтом (в том же домене), что и Ajax-back-end для приложения JavaScript, используя только GET.Понимание SessionAuthentication в django-rest-framework?

Я хочу, чтобы публичные пользователи этого API запрашивали параметр key в URL-адресе, который я буду выдавать вручную. Но я также хочу, чтобы мое приложение JavaScript могло использовать API, таким образом, что другие пользователи не могут просто украсть ключ и использовать его.

Я установил свою собственную аутентификацию ключа as described here, и он работает хорошо.

Однако я не понимаю, как приложение JavaScript должно использовать API. Очевидно, я мог бы просто передать выделенный URL-адрес key в URL-адресе, но тогда другие пользователи тривиально не смогут определить ключ и использовать его?

Мне кажется, мне нужна SessionAuthentication, но как я могу начать эту работу? Я не вижу никаких указаний in the DRF documentation о том, как мне нужно изменить свои вызовы JavaScript, чтобы использовать его.

Также я не понимаю, как SessionAuthentication позволяет приложению Ajax аутентифицироваться без возможности просмотра и копирования подлинности других пользователей.

Очень благодарен за любые советы.

+0

Обычно вы передаете токен key/auth в заголовке авторизации не в URL-адресе. Аутентификация сеанса используется, когда вы используете учетную запись django по умолчанию, после этого вы также должны быть аутентифицированы для доступа к api, вам нужно будет добавить аутентификацию сеанса для настройки остальной среды. –

+0

Вы можете использовать либо аутентификацию сеанса, либо аутентификацию по токену, либо и то, и другое. Однако, как отметил @PieterHamman, пользователю необходимо пройти аутентификацию, чтобы иметь возможность использовать API. После аутентификации пользователю необходимо передать session_id/токен в каждом заголовке запроса. Для сравнения между сеансом и токеном auth см. Http://security.stackexchange.com/questions/81756/session-authentication-vs-token-authentication. Вы также можете проверить django-rest-framework-jwt, который представляет собой пакет для drf, который реализует JWT и имеет встроенную аутентификацию. – iulian

ответ

1

Мне кажется, мне нужна SessionAuthentication, но как я могу начать эту работу? Я не вижу никаких инструкций в документации DRF о том, как мне нужно изменить мои вызовы JavaScript, чтобы использовать их.

SessionAuthentication - это Django's. Он использует сеанс для аутентификации пользователя. Это в основном прозрачно для запроса ajax, поскольку браузер автоматически отправит файл cookie. Однако, если вы отправляете данные, вам необходимо убедиться, что вы отправляете токен CSRF как в заголовках, так и в почтовом теле.

Также я не понимаю, как SessionAuthentication позволяет приложению Ajax аутентифицироваться без возможности просмотра и копирования подлинности других пользователей.

Как указано выше, для этого используются файлы cookie. Они являются частью заголовков и, как правило, не отображаются в URL-адресах. Чтобы убедиться, что никто другой не может украсть сеанс пользователя, вам нужно запустить сайт через https. Это не сильно отличается от обычных сайтов.

+0

Спасибо. Но как я могу удостовериться, что только * моему * приложению разрешено использовать SessionAuthentication и никому? Это просто работает автоматически, если они находятся в одном домене? (Я использую только запросы GET.) – Richard

+0

Не совсем ясно, что вы пытаетесь сделать с вашей проверкой подлинности, в частности, зачем им нужен этот ключевой параметр. Что касается вашего сайта, почему бы вам не установить специальную аутентификацию на токенах для вашего сайта? – Linovia

+0

Спасибо @Linovia. Повторная аутентификация. Я хочу, чтобы пользователи запрашивали ключ, прежде чем они смогут использовать API, чтобы я знал, кто они, и может контролировать доступ, если они начинают забивать API. Re мой сайт - так что я бы создать токен только для моего сайта и включить его в заголовок JS, используемый API Ajax? Разве токен не будет видимым в исходном JS? – Richard

Смежные вопросы