Usunięto poświadczenia autoryzacji - django, elastyczna łodyga fasoli, oauth

79

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." }
sahutchi
źródło
6
Jesteś moim bohaterem. Straciłem na to wiele godzin, ale jestem pewien, że uratowałeś mi o wiele więcej!
Steven
Powinieneś sam odpowiedzieć na swoje pytanie, aby nie pojawiło się na liście bez odpowiedzi :)
1
Nie mam pojęcia, ile czasu by mi to pochłonęło, ale jestem prawie pewien, że zajęłoby to trochę czasu. Oszczędza życie.
Tom Manterfield,
Wciąż oszczędzamy godziny i godziny w 2020 roku
Kyle
Uratowałeś mój czas. Nie wiem, ile dni naprawdę nie spałem całą noc. Ha ... bardzo dziękuję. Miłego dnia, naprawdę cię kocham. Wciąż oszczędzamy godziny i godziny w lipcu 2020 roku !!!!!!!!!! lol
Tim

Odpowiedzi:

30

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.

Rubén Durá Tarí
źródło
To jest miłe. Teraz, gdy awsebcli ma eb ssh, łatwiej jest być leniwym na dev-opach i czyścić ręcznie.
sahutchi
3
Wciąż aktualna odpowiedź. Chciałem dodać, że (jako początkujący użytkownik aws) możesz po prostu dodać tag commands do plików .ebextensions .config, na górze swoich container_commands, i to zadziała. Więcej o wszystkich przetwarzanych tagach tutaj: link
sean.hudson
Dwa problemy z tym: 1) działa tylko przy drugim i kolejnych wdrożeniach, 2) sed ciągle gromadzi tę samą linię w pliku konfiguracyjnym za każdym razem, gdy wdrażasz. Rozwiązanie Manel Clos (tworzenie nowego pliku w pliku conf.d Apache) nie cierpi z powodu tych problemów i działa również po zmianie zmiennych środowiskowych.
Mike Placentra
1
Od jakiegoś czasu nie używałem EB, ale zgadzam się, że jego rozwiązanie jest czystsze i bardziej eleganckie. Prawdopodobnie użyłbym tego, gdyby działał poprawnie, a powinien.
Rubén Durá Tarí
Uratowałeś weekend moich drużyn. Wielkie dzięki!
Atul Mishra
63

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

Manel Clos
źródło
7
to jest czyste rozwiązanie. działa, gdy zmieniasz zmienne środowiskowe i nie dodaje tej samej linii do pliku konfiguracyjnego za każdym razem, gdy wdrażasz.
Mike Placentra
not authorized to perform: rds:DescribeDBEngineVersions
Pojawia się
34

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.

sahutchi
źródło
5
Wydaje się, że powiedziałem zbyt wcześnie w powyższym komentarzu. Chociaż DZIAŁA to dla początkowego wdrożenia, jeśli zmienisz coś w swoim środowisku (np. Dodasz nową zmienną), nie zostanie to uruchomione, gdy te zmiany zostaną zastosowane, a plik wsgi.conf jest nadal generowany ponownie. Nie przypuszczaj, że znasz jakąkolwiek konfigurację aplikacji, która jest uruchamiana za każdym razem, gdy następuje zmiana?
Tom Manterfield
Uwzględniam to w każdym git aws.push. Ale tak, czasami tracę css, gdy zmieniam parametry. Czy coś zepsuje się w Twojej aplikacji, jeśli po wprowadzeniu zmiany w środowisku ponownie wdrożysz ostatnie wypychanie za pośrednictwem interfejsu użytkownika w środowisku - menu wersji aplikacji?
sahutchi
Wygląda na to, że ta poprawka jest nieaktualna. Druga odpowiedź Rubén Durá Tarí działa (jeśli poprawisz literówkę) i pozornie wydaje się być bardziej solidna.
skolsuper
@skolsuper co to za literówka?
Nate
1
@Nate, nie ma takiego. Kiedy go testowałem, miałem niepowiązany problem, który nieumyślnie naprawiłem w tym samym czasie, gdy „poprawiałem” literówkę. Rubén zredagował swoją odpowiedź z powrotem do stanu roboczego od czasu mojej błazenady.
skolsuper
0

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"
John LaBarge
źródło