Ответ 1
Предполагая, что вы пытаетесь использовать TokenAuthentication, заголовок должен выглядеть следующим образом:
Authorization: Token 6d82549b48a8b079f618ee9c51a6dfb59c7e2196
Как описано в документации.
Используя API Django REST, я пытаюсь выполнить аутентификацию моего запроса.
Это то, что я пытаюсь отправить:
Content-Type: application/json, Authentication: token="6d82549b48a8b079f618ee9c51a6dfb59c7e2196"
Вот что я возвращаю:
{"detail": "Authentication credentials were not provided."}
Может ли кто-нибудь дать мне правильный заголовок?
Спасибо
Заголовок:
Accept: application/json
Content-Type: application/json
Authorization: Token 6d82549b48a8b079f618ee9c51a6dfb59c7e2196
Connection: keep-alive
Origin: chrome-extension: //rest-console-id
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
Settings.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.permissions.IsAdminUser',
),
'PAGINATE_BY': 10
}
view.py
class ProfileList(generics.ListCreateAPIView):
"""
API endpoint that represents a list of users.
"""
permission_classes = (permissions.IsAuthenticated,)
model = Profile
serializer_class = ProfileSerializer
def pre_save(self, obj):
obj.owner = self.request.user
Предполагая, что вы пытаетесь использовать TokenAuthentication, заголовок должен выглядеть следующим образом:
Authorization: Token 6d82549b48a8b079f618ee9c51a6dfb59c7e2196
Как описано в документации.
На всякий случай кто-то сталкивается с этой ошибкой. Это также может произойти, если вы запускаете Django на Apache, используя mod_wsgi, потому что заголовок авторизации отключен mod_wsgi. Вам нужно добавить в конфигурацию VirtualHost следующее:
WSGIPassAuthorization On
У меня были те же проблемы с моей аутентификацией Token
Это устранило проблему для меня
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAdminUser'
),
'PAGINATE_BY': 10,
}
В моем случае это работает:
(Django REST Framework v3)
settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
views.py
class Test(APIView):
def get(self, request, format=None):
return Response({'Result': 'OK'})
urls.py
router.add_api_view('test', url(r'^test/', views.Test.as_view(),name='test'))
Не забудьте отправить данные маркера в заголовок:
Key: Authorization
Value: Token 76efd80cd6849ad7d35e04f1cc1eea35bdc20294
Чтобы сгенерировать токены, вы можете использовать следующее (где-то в вашем коде):
from rest_framework.authtoken.models import Token
user = User.objects.get(username='<username>')
token = Token.objects.create(user=user)
print(token.key)
Для тех, кто находится на эластичном бобовом стебле AWS, и вы как бы застряли с апачем, и если у вас нет
WSGIPassAuthorization On
Как уже упоминалось @Fiver, ваши заголовки разделяются
Вместо того, чтобы вручную исправлять это и создавать новое изображение, я сделал script, который проверяет, является ли последняя строка файла conf WSGIPassAuthorization On
, и если мы не обновляем его и не перезапускаем сервер
В моем приложении Django у меня есть папка config с моим файлом sh
if [[ $(tac /etc/httpd/conf/httpd.conf | egrep -m 1 .) == $(echo 'WSGIPassAuthorization On') ]];
then
echo "Httpd.conf has already been updated"
else
echo "Updating Httpd.conf.."
echo 'WSGIPassAuthorization On' >> /etc/httpd/conf/httpd.conf
service httpd restart
fi
Сделайте это excecutable, прежде чем я передам его git
chmod +x configs/server/update-apache.sh
Затем в моем файле python.config я добавляю команду в конец
...
...
container_commands:
01_migrate:
command: "python manage.py migrate"
leader_only: true
02_collectstatic:
command: "python manage.py collectstatic --noinput"
03_change_perm:
command: "chown -R wsgi:root static"
03_update_apache:
command: "sh configs/server/update-apache.sh"
Теперь любая новая машина, которая запустится, проведет проверку, чтобы проверить, обновлен ли сервер, и делает это, если нужно