Может ли Django идентифицировать доступ к стороннему приложению?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Может ли Django идентифицировать доступ к стороннему приложению?

Сообщение Anonymous »

У меня есть приложение Django, которое выполняет аутентификацию с использованием allauth, а для всего, что связано с REST, — dj-rest-auth.
Я нахожусь в процессе формализации API
  • Мое приложение Django использует конечные точки API, как правило, с помощью команд выборки JavaScript. Он аутентифицируется с помощью системы аутентификации Django (с allauth). Он не использует dj-rest-auth для аутентификации, он использует встроенную систему аутентификации Django.
  • Мой бот Discord использует API, как это обычно бывает стороннего приложения. Он аутентифицируется через dj-rest-auth, то есть внутренне обрабатывает токены обновления и сеанса, как определено в документации dj-rest-auth.
В настоящее время API полностью открыт, что означает, что любой может использовать cURL для доступа к конечным точкам, к некоторым из которых может получить доступ анонимный пользователь. Другим требуется аутентифицированный пользователь, и это делается с помощью данных заголовка запроса: Авторизация: Носитель, о чем заботится dj-rest-auth (это то, что использует мой бот Discord).Теперь я хочу расширить эту тему, включив пакет API Django Rest Framework, чтобы ключи API требовались для идентификации сторонних клиентских приложений. Например, мой бот Discord будет использовать данные заголовка Authorization: Api-Key, чтобы идентифицировать себя как клиент API. Третьи стороны должны следить за тем, чтобы их ключ API не использовался неправильно. Идея состоит в том, что API-ключ используется как дополнительный уровень авторизации, позволяющий применять другой/дополнительный доступ и ограничения. Например, моему боту Discord будет предоставлено более мягкое регулирование, чем, скажем, обычному пользователю, подавшему заявку на получение API-ключа.
Теперь мой вопрос...
Ключи API можно легко скрыть в специальном боте Discord, написанном на Python, поскольку они скрыты от пользователей бота, но что мне делать с моим обычным/текущим приложением Django, которое использует систему шаблонов? Если я использую проверку разрешений HasAPIKey для всех конечных точек, как описано в пакете API Django Rest Framework, моему собственному приложению Django будет отказано в доступе.
Я вижу два варианта< /p>
  • Либо вставьте Api-Key через промежуточное программное обеспечение (и таким образом относитесь к моему приложению Django как к любому другому клиенту), либо
  • Добавление проверки разрешений к моим конечным точкам DRF, например. IsUsingFirstPartyApp.
Проблема в том, что я могу придумать только один способ определения «первого доступа» — через данные заголовка запроса HTTP_ORIGIN и HTTP_REFERER.
Я мог бы сделать что-то вроде следующего (комментарии к коду удалены для краткости)...

Код: Выделить всё

class IsUsingFirstPartyApp(permissions.BasePermission):

def __init__(self):
self.ALLOWED_ORIGIN = getattr(settings, 'SITE_URL', None)
if not self.ALLOWED_ORIGIN:
raise ValueError("SITE_URL is not set in Django settings.")

def has_permission(self, request, view):
origin = request.META.get('HTTP_ORIGIN')
referer = request.META.get('HTTP_REFERER')

def is_valid_origin(header_value):
try:
parsed_origin = urlparse(header_value)
return f"{parsed_origin.scheme}://{parsed_origin.netloc}" == self.ALLOWED_ORIGIN
except ValueError:  # Catch specific parsing errors
return False

if origin:
return is_valid_origin(origin)

if referer:
return is_valid_origin(referer)

return False
Для этого он проверяет, выполняются ли запросы от самого себя, например. из app.example.com.
Если я объединим это с проверкой разрешений HasAPIKey (т. е. логическим ИЛИ), то мой обычный веб-сайт Django сможет использовать API-ключ меньше, как это было всегда. Я могу проверить это локально с помощью cURL, где cURL получает ошибку аутентификации, но анонимный пользователь, использующий веб-сайт через браузер, может легко получить доступ к конечной точке (через запрос на выборку JavaScript).
Единственная альтернатива, которую я могу придумать, — перенести эту же проверку в промежуточное программное обеспечение Django и вставить API-ключ в заголовок запроса. Это дало бы преимущества для контролируемого регулирования.
Или, может быть, то, что я делаю, совершенно не соответствует действительности и не соответствует лучшим практикам. На правильном ли я пути или есть другой способ сделать это?

Подробнее здесь: https://stackoverflow.com/questions/790 ... app-access
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Лицензирование Android: как сообщить стороннему авторскому праву при выпуске библиотеки
    Anonymous » » в форуме Android
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Подключитесь к стороннему плагину Wordpress через Cron
    Anonymous » » в форуме Php
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Подключитесь к стороннему плагину Wordpress через Cron
    Anonymous » » в форуме Php
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Добавить зависимость пакета django к установленному приложению проекта
    Гость » » в форуме Python
    0 Ответы
    25 Просмотры
    Последнее сообщение Гость
  • Невозможно получить доступ к локально размещенному приложению .php с IP-адресов вне сети.
    Гость » » в форуме Php
    0 Ответы
    39 Просмотры
    Последнее сообщение Гость

Вернуться в «Python»