web-dev-qa-db-fra.com

Informations d'authentification dépouillées --- Django, haricot élastique, oauth

J'ai implémenté une api REST dans Django avec Django-rest-framework et utilisé oauth2 pour l'authentification.

J'ai testé avec:

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/

et

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

sur localhost avec des résultats satisfaisants conformes à la documentation.

Lorsque je transmettais cela à une instance AWS élastique à haricot élastique existante, j'ai reçu:

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

J'utilise une approche légèrement différente maintenant. La solution de sahutchi a fonctionné tant que les variables env ne sont pas modifiées, comme l'a souligné Tom Dickin. J'ai creusé un peu plus profondément dans EB et découvert où se trouve le modèle wsgi.conf et ajouté l'option "WSGIPassAuthorization On".

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

Cela fonctionnera toujours, même lorsque vous modifiez des variables d'environnement. J'espère que tu trouves cela utile.

Edit: On dirait que beaucoup de gens continuent de frapper cette réponse. Je n'ai pas utilisé ElasticBeanstalk depuis un moment, mais je voudrais utiliser la solution de Manel Clos ci-dessous. Je ne l'ai pas essayé personnellement, mais semble une solution beaucoup plus propre. Celui-ci est littéralement un hack sur les scripts EBs et pourrait potentiellement casser à l'avenir si EB les met à jour, spécialement s'ils les déplacent vers un autre emplacement.

25
Rubén Durá Tarí

J'aime l'idée d'avoir juste une configuration supplémentaire à la place standard. Dans votre répertoire .ebextensions, créez un fichier wsgi_custom.config avec:

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

Tel que posté ici: https://forums.aws.Amazon.com/message.jspa?messageID=376244

46
Manel Clos

Je pensais que le problème venait de ma configuration sous Django ou d'un autre type d'erreur au lieu de me concentrer sur les différences entre localhost et EB. Le problème concerne les paramètres Apache d'EB.

WSGIPassAuthorization est défini de manière native sur OFF, il doit donc être activé. Cela peut être fait dans votre fichier * .config dans votre dossier .ebextensions en ajoutant la commande suivante:

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

S'il vous plaît laissez-moi savoir si j'ai manqué quelque chose ou s'il y a une meilleure façon, je devrais regarder le problème. Je ne pouvais rien trouver de particulier à ce sujet sur le Web et je pensais que cela permettrait à quelqu'un d'économiser des heures de dépannage puis de se sentir idiot.

34
sahutchi

Bien que la solution ci-dessus soit intéressante, il existe un autre moyen. Conservez le fichier de configuration VirtualHost wsgi.conf que vous souhaitez utiliser dans .ebextensions et écrasez-le dans un crochet post-déploiement (vous ne pouvez pas effectuer ce déploiement préalable car il sera régénéré Si vous faites cela, pour redémarrer, assurez-vous d’utiliser le programme supervisorctl pour redémarrer afin que toutes vos variables d’environnement soient correctement définies. (Je l’ai aussi trouvé à la dure.) 

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