Berechtigungsnachweise entfernt - Django, elastische Bohnenstange, oauth

79

Ich habe eine REST-API in Django mit Django-Rest-Framework implementiert und oauth2 zur Authentifizierung 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 im Einklang mit der Dokumentation.

Als ich dies auf eine vorhandene AWS-Instanz für elastische Bohnenstangen hochschob, erhielt ich:

{ "detail" : "Authentication credentials were not provided." }
Sahutchi
quelle
6
Sie sind mein Held. Ich habe viele Stunden damit verschwendet, aber ich bin sicher, Sie haben mich noch viel mehr gerettet!
Steven
Sie sollten Ihre Frage selbst beantworten, damit sie nicht in der unbeantworteten Liste erscheint :)
1
Ich habe keine Ahnung, wie viel Zeit ich davon verschlungen hätte, aber ich bin mir ziemlich sicher, dass es eine Weile gedauert hätte. Lebensretter.
Tom Manterfield
Noch Stunden und Stunden im Jahr 2020 sparen
Kyle
Du hast meine Zeit gespart. Ich weiß nicht, wie viele Tage ich wirklich die ganze Nacht wach geblieben bin. Ha ... vielen Dank. Einen schönen Tag noch, ich liebe dich wirklich. Immer noch Stunden und Stunden im Juli 2020 sparen !!!!!!!!!! lol
Tim

Antworten:

30

Ich benutze jetzt einen etwas anderen Ansatz. Sahutchis Lösung funktionierte, solange die Env-Variablen nicht geändert wurden, wie Tom Dickin betonte. 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, Sie finden es nützlich.

Bearbeiten: Es scheint, als würden viele Leute diese Antwort immer noch treffen. Ich habe ElasticBeanstalk schon eine Weile nicht mehr verwendet, aber ich würde die unten stehende Lösung von Manel Clos untersuchen. Ich habe es nicht persönlich ausprobiert, aber es scheint eine viel sauberere Lösung zu sein. Dies ist buchstäblich ein Hack für EBs-Skripte und könnte möglicherweise in Zukunft unterbrochen werden, wenn EB sie aktualisiert, insbesondere wenn sie an einen anderen Speicherort verschoben werden.

Rubén Durá Tarí
quelle
Das ist nett. Jetzt, wo awsebcli eb ssh hat, fällt es mir leichter, faul auf Entwickler zu sein und von Hand aufzuräumen.
Sahutchi
3
Immer noch relevante Antwort. Wollten Sie hinzufügen, dass (als Neuling aws-Benutzer) Sie einfach das Befehlstag zu Ihren .ebextensions .config-Dateien hinzufügen können, zusätzlich zu Ihren container_commands, und es wird funktionieren. Mehr zu allen Tags, die hier verarbeitet werden: link
sean.hudson
Zwei Probleme dabei: 1) Funktioniert nur bei zweiten und nachfolgenden Bereitstellungen, 2) sed stapelt sich bei jeder Bereitstellung in derselben Zeile in der Konfigurationsdatei. Die Lösung von Manel Clos (Erstellen einer neuen Datei in Apaches conf.d) leidet nicht unter diesen Problemen und funktioniert auch, wenn Sie Umgebungsvariablen ändern.
Mike Placentra
1
Ich habe EB schon eine Weile nicht mehr verwendet, aber ich stimme zu, dass seine Lösung sauberer und eleganter ist. Ich würde das wahrscheinlich verwenden, wenn es richtig funktioniert, was es sollte.
Rubén Durá Tarí
Du hast mein Teamwochenende gerettet. Vielen Dank!
Atul Mishra
63

Ich mag die Idee, nur eine zusätzliche Konfiguration am Standardplatz zu haben. Erstellen Sie in Ihrem Verzeichnis .ebextensions eine Datei wsgi_custom.config mit:

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

Wie hier veröffentlicht: https://forums.aws.amazon.com/message.jspa?messageID=376244

Manel Clos
quelle
7
Dies ist eine saubere Lösung. Es funktioniert, wenn Sie Umgebungsvariablen ändern, und fügt nicht bei jeder Bereitstellung dieselbe Zeile in eine Konfigurationsdatei ein.
Mike Placentra
Diesen Fehler bekommen:not authorized to perform: rds:DescribeDBEngineVersions
Chirag Maliwal
34

Ich dachte, das Problem liege in meiner Konfiguration in Django oder einem anderen Fehlertyp, anstatt mich auf die Unterschiede zwischen localhost und EB zu konzentrieren. Das Problem liegt in den 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 hinzugefügten Befehl erfolgen:

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

Bitte lassen Sie mich wissen, wenn ich etwas verpasst habe oder wenn es einen besseren Weg gibt, das Problem zu betrachten. Ich konnte nirgendwo im Internet etwas Spezielles darüber finden und dachte, dies könnte jemandem Stunden der Fehlerbehebung ersparen und mich dann dumm fühlen.

Sahutchi
quelle
5
Scheint, als hätte ich in meinem obigen Kommentar zu früh gesprochen. Während dies für eine erste Bereitstellung funktioniert, wird dies nicht ausgeführt, wenn Sie etwas in Ihrer Umgebung ändern (z. B. eine neue Variable hinzufügen), wenn diese Änderungen angewendet werden, und die wsgi.conf wird anscheinend immer noch neu generiert. Angenommen, Sie kennen eine App-Konfiguration, die bei jeder Änderung ausgeführt wird?
Tom Manterfield
Ich schließe dies in jedem git aws.push ein. Aber ja, ich verliere manchmal CSS, wenn ich Parameter ändere. Würde irgendetwas in Ihrer App kaputt gehen, wenn Sie nach einer Änderung an Ihrer Umgebung den letzten Push über die Benutzeroberfläche in der Umgebung erneut bereitstellen würden - Menü "Anwendungsversion"?
Sahutchi
Es sieht so aus, als ob dieses Update nicht mehr aktuell ist. Die Zweitplatzierte von Rubén Durá Tarí funktioniert (wenn Sie den Tippfehler beheben) und scheint auf den ersten Blick robuster zu sein.
Skolsuper
@skolsuper was ist der Tippfehler?
Nate
1
@Nate gibt es keine. Als ich es getestet habe, hatte ich ein nicht verwandtes Problem, das ich versehentlich behoben habe, während ich den Tippfehler "korrigiert" habe. Rubén hat seine Antwort seit meinem Trottel wieder in einen funktionierenden Zustand versetzt.
Skolsuper
0

Obwohl die obige Lösung interessant ist, gibt es einen anderen Weg. Behalten Sie die VirtualHost-Konfigurationsdatei wsgi.conf bei, die Sie in .ebextensions verwenden möchten, und überschreiben Sie sie in einem Post-Deployment-Hook (Sie können diese Vorbereitstellung nicht durchführen, da sie neu generiert wird (ja, ich habe dies schwer herausgefunden) Wenn Sie dies tun, stellen Sie zum Neustart sicher, dass Sie das Supervisorctl-Programm zum Neustart verwenden, damit alle Umgebungsvariablen richtig eingestellt werden. (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"
John LaBarge
quelle