Повноваження авторизації позбавлені - django, еластичне бобове стебло, oauth


79

Я реалізував 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/

на localhost із успішними результатами, що відповідають документації.

Підштовхуючи це до існуючого екземпляра еластичного зерна AWS, я отримав:

{ "detail" : "Authentication credentials were not provided." }

6
Ви - мій герой. Я витратив на це багато годин, але впевнений, що ти врятував мене ще багато!
Стівен

Вам слід відповісти на своє запитання самостійно, щоб воно не відображалося у списку без відповіді :)

1
Я не уявляю, скільки мого часу це з'їло б, але я майже впевнений, що це пройшло б деякий час. Рятувальник життя.
Том Мантерфілд,

Все ще економимо години та години у 2020 році
Кайл

Ти врятував мій час. Не знаю, скільки днів я справді просидів цілу ніч. Ха ... велике спасибі. Гарного дня, я вас дуже люблю. Економимо години та години у липні 2020 року !!!!!!!!!! лол
Тім

Відповіді:


30

Зараз я використовую дещо інший підхід. Рішення sahutchi працювало до тих пір, поки змінні env не змінювались, як зазначив Том Дікін. Я заглибився трохи глибше в EB і дізнався, де знаходиться шаблон wsgi.conf, і додав туди опцію "WSGIPassAuthorization On".

commands:
  WSGIPassAuthorization:
    command: sed -i.bak '/WSGIScriptAlias/ a WSGIPassAuthorization On' config.py
    cwd: /opt/elasticbeanstalk/hooks

Це завжди спрацює, навіть коли змінюються змінні середовища. Сподіваюся, вам це буде корисно.

Редагувати: Здається, багато людей все ще вражають цю відповідь. Я давно не використовував ElasticBeanstalk, але я б задумався про використання рішення Manel Clos нижче. Я не пробував це особисто, але здається набагато чистішим рішенням. Це буквально хак на сценарії EB і може потенційно зламатися в майбутньому, якщо EB оновить їх, особливо якщо вони перенесуть їх в інше місце.


Це добре. Тепер, коли awsebcli має eb ssh, мені стало легше лінуватися на розробниках і робити прибирання вручну.
sahutchi

3
Досі відповідна відповідь. Хотів додати, що (як користувач-початківець aws) ви можете просто додати тег команд до своїх файлів .ebextensions .config поверх ваших команд container_commands, і це буде працювати. Детальніше про всі теги, які обробляються тут: посилання
sean.hudson

Дві проблеми з цим: 1) працює лише при другому та наступних розгортаннях, 2) sed продовжує накопичувати той самий рядок у файлі конфігурації кожного разу, коли ви розгортаєте. Рішення Manel Clos (створення нового файлу в Apache's conf.d) не страждає від цих проблем, і воно також працює, коли ви змінюєте змінні середовища.
Майк Плацентра,

1
Я давно не використовував EB, але погоджуюсь, що його рішення є чистішим та витонченішим. Я б, мабуть, скористався цим, якщо він працює належним чином, що і слід.
Рубен Дура Тарі,

Ви врятували мої команди на вихідних. Дуже дякую!
Атул Мішра,

63

Мені подобається ідея просто мати якусь додаткову конфігурацію на стандартному місці. У вашому каталозі .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


7
це чисте рішення. він працює, коли ви змінюєте змінні середовища, і не продовжує додавати один і той же рядок у конфігураційний файл кожного разу, коли ви розгортаєте.
Майк Плацентра,

Помилка цієї помилки:not authorized to perform: rds:DescribeDBEngineVersions
Chirag Maliwal

34

Я думав, що проблема в моїй конфігурації в django або якомусь іншому типі помилок, замість того, щоб зосередити увагу на різниці між localhost та EB. Проблема в налаштуваннях Apache від EB.

WSGIPassAuthorization спочатку встановлено на OFF, тому його потрібно ввімкнути. Це можна зробити у вашому файлі * .config у вашій папці .ebextensions, додавши наступну команду:

container_commands:
  01_wsgipass:
    command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'

Будь ласка, дайте мені знати, якщо я щось пропустив, чи є кращий спосіб розглянути проблему. Я не міг знайти нічого конкретно про це ніде в Інтернеті, і думав, що це може заощадити комусь години пошуку та усунення помилок.


5
Здається, я говорив занадто рано у своєму вищезазначеному коментарі. Хоча це ПРАЦЮЄ для початкового розгортання, якщо ви щось змінили у своєму середовищі (наприклад, додали нову змінну), це не запускається, коли ці зміни застосовуються, і wsgi.conf все ще регенерується, здається. Не думаєте, що ви знаєте будь-яку конфігурацію програми, яка запускається кожного разу, коли відбувається зміна?
Том Мантерфілд,

Я включаю це в кожен git aws.push. Але так, я іноді втрачаю css, коли змінюю параметри. Чи не зламається щось у вашому додатку, якщо після внесення змін у ваше середовище ви повторно розгорнули останній натиск через інтерфейс користувача в середовищі - меню версії програми?
sahutchi

Схоже, це виправлення застаріло. Відповідь, яка посідає друге місце від Рубена Дури Тарі, працює (якщо ви виправите друкарську помилку), і на перший погляд видається більш надійною.
skolsuper

@skolsuper яка помилка?
Нейт

1
@Nate немає жодного. Під час тестування у мене виникла непов’язана проблема, яку мимоволі виправили одночасно з «виправленням» друкарської помилки. Рубен відредагував свою відповідь назад до робочого стану з моїх буфонів.
skolsuper

0

Хоча вищезазначене рішення цікаве, є й інший спосіб. Зберігайте файл конфігурації wsgi.conf VirtualHost, який ви хочете використовувати в .ebextensions, і перезапишіть його в гачку після розгортання (ви не можете зробити це попереднє розгортання, оскільки воно буде повторно сформовано (так, я знайшов це важко Якщо ви зробите це, щоб перезавантажити, переконайтеся, що використовуєте програму 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.