Учетные данные авторизации Разделенные --- django, эластичный beanstalk, oauth
Я реализовал REST api в django с django-rest-framework и использовал oauth2 для аутентификации.
Я тестировал с помощью:
curl -X POST -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=password&username=YOUR_USERNAME&password=YOUR_PASSWORD" http://localhost:8000/oauth2/access_token/
и
curl -H "Authorization: Bearer <your-access-token>" http://localhost:8000/api/
на локальном хосте с успешными результатами, соответствующими документации.
При нажатии этой кнопки на существующий экземпляр экскаватора beanstalk AWS я получил:
{ "detail" : "Authentication credentials were not provided." }
Ответы
Ответ 1
Сейчас я использую немного другой подход. Решение sahutchi работало до тех пор, пока переменные env не были изменены, как указал Том Дикин. Я немного углубился внутри EB и узнал, где находится шаблон wsgi.conf, и добавил там опцию "WSGIPassAuthorization On".
commands:
WSGIPassAuthorization:
command: sed -i.bak '/WSGIScriptAlias/ a WSGIPassAuthorization On' config.py
cwd: /opt/elasticbeanstalk/hooks
Это всегда будет работать даже при изменении переменных окружения. Надеюсь, вы сочтете это полезным.
Edit: Похоже, что многие люди все еще сталкиваются с этим ответом. Я не использовал ElasticBeanstalk через некоторое время, но я бы рассмотрел использование решения Manel Clos ниже. Я не пробовал это лично, но кажется гораздо более чистым решением. Это буквально взломать сценарии EBs и может потенциально прерваться в будущем, если EB обновит их, особенно если они переместят их в другое место.
Ответ 2
Я думал, что проблема связана с моей конфигурацией в django или другом типе ошибок, вместо того, чтобы сосредоточиться на различиях между localhost и EB. Проблема связана с настройками EB Apache.
WSGIPassAuthorization изначально устанавливается в OFF, поэтому ее необходимо включить. Это можно сделать в файле *.config в папке .ebextensions с добавленной командой:
container_commands:
01_wsgipass:
command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
Пожалуйста, дайте мне знать, если я что-то пропустил, или если есть лучший способ, я должен смотреть на проблему. Я не мог найти ничего конкретно об этом в любом месте в Интернете и думал, что это может сэкономить несколько часов на устранении неполадок, а затем чувствовать себя глупо.
Ответ 3
Мне нравится идея просто иметь дополнительную конфигурацию на стандартном месте. В каталоге .ebextensions создайте файл wsgi_custom.config с помощью:
files:
"/etc/httpd/conf.d/wsgihacks.conf":
mode: "000644"
owner: root
group: root
content: |
WSGIPassAuthorization On
Как указано здесь: https://forums.aws.amazon.com/message.jspa?messageID=376244
Ответ 4
Хотя вышеупомянутое решение интересно, есть и другой способ. Сохраните конфигурационный файл wsgi.conf VirtualHost, который вы хотите использовать в .ebextensions, и перезапишите его в узле post deploy (вы не можете выполнить это предварительное развертывание, потому что оно будет повторно сгенерировано (да, я обнаружил, что это сложно путь).Если вы это сделаете, перезагрузитесь, обязательно используйте программу supervisorctl для перезапуска, чтобы правильно установить все ваши переменные среды. (Я тоже нашел это с трудом.)
cp /tmp/wsgi.conf /etc/httpd/conf.d/wsgi.conf
/usr/local/bin/supervisorctl -c /opt/python/etc/supervisord.conf restart httpd
exit 0
01_python.config:
05_fixwsgiauth:
command: "cp .ebextensions/wsgi.conf /tmp"