Zaimplementowałem REST API w django z django-rest-framework i użyłem oauth2 do uwierzytelnienia.
Testowałem z:
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/
i
curl -H "Authorization: Bearer <your-access-token>" http://localhost:8000/api/
na hoście lokalnym z pomyślnymi wynikami zgodnymi z dokumentacją.
Podczas przekazywania tego do istniejącej instancji łodygi elastycznej fasoli AWS otrzymałem:
{ "detail" : "Authentication credentials were not provided." }
Odpowiedzi:
Teraz używam nieco innego podejścia. Rozwiązanie firmy Sahutchi działało tak długo, jak zmienne środowiskowe nie ulegały zmianie, jak zauważył Tom Dickin. Poszperałem trochę głębiej w EB i dowiedziałem się, gdzie znajduje się szablon wsgi.conf i dodałem tam opcję "WSGIPassAuthorization On".
commands: WSGIPassAuthorization: command: sed -i.bak '/WSGIScriptAlias/ a WSGIPassAuthorization On' config.py cwd: /opt/elasticbeanstalk/hooks
To zawsze zadziała, nawet przy zmianie zmiennych środowiskowych. Mam nadzieję, że uznasz to za przydatne.
Edycja: Wygląda na to, że wiele osób nadal naciska na tę odpowiedź. Od jakiegoś czasu nie używałem ElasticBeanstalk, ale przyjrzałbym się zastosowaniu rozwiązania Manel Clos poniżej. Nie próbowałem tego osobiście, ale wydaje się znacznie czystszym rozwiązaniem. Ten jest dosłownie włamaniem do skryptów EB i może potencjalnie zepsuć się w przyszłości, jeśli EB je zaktualizuje, szczególnie jeśli przeniesie je w inne miejsce.
źródło
Podoba mi się pomysł posiadania dodatkowej konfiguracji w standardowym miejscu. W katalogu .ebextensions utwórz plik wsgi_custom.config zawierający:
files: "/etc/httpd/conf.d/wsgihacks.conf": mode: "000644" owner: root group: root content: | WSGIPassAuthorization On
Jak opublikowano tutaj: https://forums.aws.amazon.com/message.jspa?messageID=376244
źródło
not authorized to perform: rds:DescribeDBEngineVersions
Myślałem, że problem dotyczy mojej konfiguracji w django lub innego typu błędu, zamiast skupiać się na różnicach między localhost i EB. Problem dotyczy ustawień Apache EB.
Autoryzacja WSGIPassAuthorization jest natywnie ustawiona na WYŁ., Więc musi być włączona. Można to zrobić w pliku * .config w folderze .ebextensions, dodając następujące polecenie:
container_commands: 01_wsgipass: command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
Daj mi znać, jeśli coś przeoczyłem lub jeśli jest lepszy sposób, bym mógł przyjrzeć się problemowi. Nie mogłem znaleźć nic konkretnego na ten temat w dowolnym miejscu w sieci i pomyślałem, że może to zaoszczędzić komuś godzin rozwiązywania problemów, a potem poczuć się głupio.
źródło
Chociaż powyższe rozwiązanie jest interesujące, jest inny sposób. Zachowaj plik konfiguracyjny WSgi.conf VirtualHost, którego chcesz użyć w .ebextensions, i nadpisz go w haku po wdrożeniu (nie możesz tego zrobić przed wdrożeniem, ponieważ zostanie ponownie wygenerowany (tak, okazało się to trudne Jeśli to zrobisz, aby zrestartować komputer, upewnij się, że używasz programu supervisorctl do ponownego uruchomienia, aby wszystkie zmienne środowiskowe zostały poprawnie ustawione (znalazłem to również na własnej skórze).
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"
źródło