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 enviar esto a una instancia de AWS elastic beanstalk existente, recibí:
{ "detail" : "Authentication credentials were not provided." }
Respuestas:
Ahora uso un enfoque ligeramente diferente. La solución de sahutchi funcionó siempre que las variables env no se cambiaran como señaló Tom Dickin. Investigué un poco más dentro de EB y descubrí dónde se encuentra la plantilla wsgi.conf y agregué la opción "WSGIPassAuthorization On" allí.
commands: WSGIPassAuthorization: command: sed -i.bak '/WSGIScriptAlias/ a WSGIPassAuthorization On' config.py cwd: /opt/elasticbeanstalk/hooks
Eso siempre funcionará, incluso cuando se cambian las variables de entorno. Espero que le sea útil.
Editar: Parece que mucha gente todavía está respondiendo a esta respuesta. No he usado ElasticBeanstalk en 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 los scripts de EB y podría romperse en el futuro si EB los actualiza, especialmente si los mueve a una ubicación diferente.
fuente
Me gusta la idea de tener una configuración adicional 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
fuente
not authorized to perform: rds:DescribeDBEngineVersions
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 está en la configuración de Apache de EB.
WSGIPassAuthorization está configurado de forma nativa en OFF, por lo que debe estar encendido. 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 ver el problema. No pude encontrar nada específicamente sobre esto en ninguna parte de la web y pensé que esto podría ahorrarle a alguien horas de solución de problemas y luego sentirse tonto.
fuente
Aunque la solución anterior es interesante, hay otra forma. Mantenga el archivo de configuración wsgi.conf VirtualHost que desea usar en .ebextensions y sobrescríbalo en un gancho posterior a la implementación (no puede hacer esta implementación previa porque se volverá a generar (sí, descubrí esto en el difícil manera). Si hace esto, para reiniciar, asegúrese de usar el programa supervisorctl para reiniciar y así obtener todas las variables de entorno configuradas correctamente (también descubrí esto por las malas).
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"
fuente