webentwicklung-frage-antwort-db.com.de

Berechtigungsnachweise entfernt --- Django, elastische Bohnenstange, oauth

Ich habe eine REST - API in Django mit Django-rest-framework implementiert und zur Authentifizierung oauth2 verwendet.

Ich habe getestet mit:

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/

und

curl -H "Authorization: Bearer <your-access-token>" http://localhost:8000/api/

auf localhost mit erfolgreichen Ergebnissen, die der Dokumentation entsprechen.

Beim Hochfahren auf eine vorhandene AWS-Instanz für elastische Beanstalk erhielt ich Folgendes:

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

Ich gehe jetzt etwas anders vor. Die Lösung von Sahutchi funktionierte, solange die Env-Variablen nicht geändert wurden, wie Tom Dickin feststellte. Ich habe etwas tiefer in EB gegraben und herausgefunden, wo sich die Vorlage "wsgi.conf" befindet, und dort die Option "WSGIPassAuthorization On" hinzugefügt.

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

Das funktioniert immer, auch wenn Umgebungsvariablen geändert werden. Ich hoffe du findest es nützlich.

Edit: Scheint, als würden viele Leute diese Antwort immer noch treffen. Ich habe ElasticBeanstalk seit einiger Zeit nicht mehr verwendet, aber ich würde die Lösung von Manel Clos weiter unten betrachten. Ich habe es nicht persönlich ausprobiert, scheint aber eine viel sauberere Lösung zu sein. Dies ist buchstäblich ein Hack an EBs-Skripten und könnte in der Zukunft möglicherweise brechen, wenn EB sie aktualisiert, insbesondere wenn sie an einen anderen Ort verschoben werden.

25

Ich mag die Idee, nur eine zusätzliche Konfiguration an der Standardposition zu haben. Erstellen Sie in Ihrem Verzeichnis .ebextensions eine Datei mit dem Namen wsgi_custom.config mit:

files:
  "/etc/httpd/conf.d/wsgihacks.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      WSGIPassAuthorization On

Wie hier gepostet: https://forums.aws.Amazon.com/message.jspa?messageID=376244

46
Manel Clos

Ich dachte, das Problem lag bei meiner Konfiguration in Django oder einem anderen Fehlertyp, anstatt mich auf die Unterschiede zwischen localhost und EB zu konzentrieren. Das Problem betrifft die Apache-Einstellungen von EB.

WSGIPassAuthorization ist nativ auf OFF gesetzt, daher muss es eingeschaltet sein. Dies kann in Ihrer * .config-Datei in Ihrem .ebextensions-Ordner mit dem folgenden Befehl erfolgen:

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

Bitte lassen Sie mich wissen, wenn ich etwas verpasst habe oder ob es eine bessere Möglichkeit gibt, das Problem zu untersuchen. Ich konnte nirgendwo im Internet irgendetwas zu diesem Thema finden und dachte, dies könnte jemandem helfen, stundenlanges Problem zu beheben und sich dann dumm zu fühlen.

34
sahutchi

Obwohl die obige Lösung interessant ist, gibt es einen anderen Weg. Behalten Sie die wsgi.conf-VirtualHost-Konfigurationsdatei, die Sie in .ebextensions verwenden möchten, und überschreiben Sie sie in einem Post-Deployment-Hook (Sie können diese Pre-Deployment-Funktion nicht ausführen, da sie erneut generiert wird (ja, ich habe das schwer herausgefunden) Wenn Sie dies tun, stellen Sie sicher, dass Sie zum Neustart das Programm supervisorctl verwenden, um alle Umgebungsvariablen richtig festzulegen. (Ich habe dies auch auf die harte Tour herausgefunden.) 

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"
0
John LaBarge