Учетные данные авторизации Разделенные --- 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"