subir proyecto postgres elastic ec2 deploy awsebcli aws aplicaciones django amazon-web-services oauth-2.0 elastic-beanstalk django-rest-framework

proyecto - Credenciales de autorización eliminadas-django, beanstalk elástico, oauth



python en aplicaciones web (4)

Implementé una API REST en django con django-rest-framework y usé oauth2 para la autenticación.

Probé con:

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/

y

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

en localhost con resultados exitosos consistentes con la documentación.

Al llevar esto a una instancia existente de Beanstalk elástico de AWS, recibí:

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


Aunque la solución anterior es interesante, hay otra manera. Guarde el archivo de configuración de VirtualHost wsgi.conf que desea utilizar en .ebextensions, y sobrescríbalo en un enganche de despliegue posterior (no puede hacer este despliegue previo porque se volverá a generar (sí, esto me resultó difícil) manera). Si haces esto, para reiniciar, asegúrate de usar el programa supervisorctl para reiniciar a fin de que todas tus variables de entorno estén configuradas correctamente. (Esto también me resultó difícil).

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"


Me gusta la idea de tener una configuración extra en el lugar estándar. En su directorio .ebextensions, cree un archivo wsgi_custom.config con:

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

Como se publicó aquí: https://forums.aws.amazon.com/message.jspa?messageID=376244


Pensé que el problema era con mi configuración en django o algún otro tipo de error en lugar de centrarme en las diferencias entre localhost y EB. El problema es con la configuración de Apache de EB.

WSGIPassauthorization está configurado originalmente en OFF, por lo que debe estar activado. Esto se puede hacer en su archivo * .config en su carpeta .ebextensions con el siguiente comando agregado:

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

Por favor, avíseme si me perdí algo o si hay una mejor manera de que vea el problema. No pude encontrar nada específicamente sobre esto en ningún sitio de la web y pensé que esto podría ahorrarle horas a alguien para solucionar problemas y luego me sentiría insensato.


Yo uso un enfoque ligeramente diferente ahora. La solución de Sahutchi funcionó siempre que las variables de env no se cambiaran como señaló Tom Dickin. Profundicé un poco más dentro de EB y descubrí dónde se encuentra la plantilla wsgi.conf y agregué allí la opción "WSGIPassAuthorization On".

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

Eso siempre funcionará, incluso al cambiar las variables de entorno. Espero que le sea útil.

Editar: Parece que mucha gente aún está respondiendo. No he usado ElasticBeanstalk por un tiempo, pero consideraría usar la solución de Manel Clos a continuación. No lo he probado personalmente, pero parece una solución mucho más limpia. Este es literalmente un truco en scripts EBs y podría potencialmente romperse en el futuro si EB los actualiza, especialmente si los mueven a una ubicación diferente.