Я нахожусь в процессе формализации API
- Мое приложение Django использует конечные точки API, как правило, с помощью команд выборки JavaScript. Он аутентифицируется с помощью системы аутентификации Django (с allauth). Он не использует dj-rest-auth для аутентификации, он использует встроенную систему аутентификации Django.
- Мой бот Discord использует API, как это обычно бывает стороннего приложения. Он аутентифицируется через dj-rest-auth, то есть внутренне обрабатывает токены обновления и сеанса, как определено в документации dj-rest-auth.
Теперь мой вопрос...
Ключи API можно легко скрыть в специальном боте Discord, написанном на Python, поскольку они скрыты от пользователей бота, но что мне делать с моим обычным/текущим приложением Django, которое использует систему шаблонов? Если я использую проверку разрешений HasAPIKey для всех конечных точек, как описано в пакете API Django Rest Framework, моему собственному приложению Django будет отказано в доступе.
Я вижу два варианта< /p>
- Либо вставьте Api-Key через промежуточное программное обеспечение (и таким образом относитесь к моему приложению Django как к любому другому клиенту), либо
- Добавление проверки разрешений к моим конечным точкам DRF, например. IsUsingFirstPartyApp.
Я мог бы сделать что-то вроде следующего (комментарии к коду удалены для краткости)...
Код: Выделить всё
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
Если я объединим это с проверкой разрешений HasAPIKey (т. е. логическим ИЛИ), то мой обычный веб-сайт Django сможет использовать API-ключ меньше, как это было всегда. Я могу проверить это локально с помощью cURL, где cURL получает ошибку аутентификации, но анонимный пользователь, использующий веб-сайт через браузер, может легко получить доступ к конечной точке (через запрос на выборку JavaScript).
Единственная альтернатива, которую я могу придумать, — перенести эту же проверку в промежуточное программное обеспечение Django и вставить API-ключ в заголовок запроса. Это дало бы преимущества для контролируемого регулирования.
Или, может быть, то, что я делаю, совершенно не соответствует действительности и не соответствует лучшим практикам. На правильном ли я пути или есть другой способ сделать это?
Подробнее здесь: https://stackoverflow.com/questions/790 ... app-access