Передача маркера в заголовке конечной точки ListAPIView от одного api к другому Django REST
У меня есть 2 API в Django REST.
Один API генерирует токен JWT.
Я хочу отправить этот токен в другой API.
В первом API (API 1) я передаю токен классу ListItems (/someendpoint/) в заголовке POST запроса.
import requests
token = "someToken"
requests.post("/posting/token", {token})
В другом API (API 2) я хочу получить этот JWT-токен в заголовке запроса :
в файле views.py:
class ListItems(generics.ListAPIView):
permission_classes = [ItemsPermissions]
queryset = SomeModel.objects.all()
serializer_class = SomeSerializer
в urls.py:
url_patterns = [
path("/someendpoint/list/", ListItems.as_view(),
]
Каков наилучший способ достижения этой цели?
Как документировано в TokenAuthentication:
Для аутентификации клиентов ключ токена должен быть включен в HTTP-заголовок Authorization. Ключ должен иметь префикс в виде строкового литерала
"Token"
, с пробелами, разделяющими две строки.
Но он не ограничивается префиксом "Token"
, как отмечалось:
Примечание: Если вы хотите использовать другое ключевое слово в заголовке, например
Bearer
, просто подкласс TokenAuthentication и установите переменную класса ключевого слова.
Поскольку вы используете JWT токен:
представления, требующие аутентификации, будут искать заголовок следующего формата:
Authorization: Bearer <token>
. Эта настройка может также содержать список или кортеж возможных типов заголовков (например, ('Bearer', 'JWT')
Так что вы можете попробовать:
response = requests.get("/someendpoint/list/", headers={"Authorization": "Bearer eyJxxxxxx"})
Or:
response = requests.get("/someendpoint/list/", headers={"Authorization": "JWT eyJxxxxxx"})
Убедитесь, что вы правильно настроили классы аутентификации, как описано здесь либо через:
- views.py
class ListItems(generics.ListAPIView):
authentication_classes = [
# Only list here what you needed
rest_framework.authentication.TokenAuthentication,
rest_framework_jwt.authentication.JSONWebTokenAuthentication,
]
...
- or settings.py
...
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
# Only list here what you needed
'rest_framework.authentication.TokenAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
],
...
}
...