Credenciales de autorización eliminadas: django, elastic beanstalk, oauth

79

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." }
sahutchi
fuente
6
Eres mi héroe. He perdido muchas horas en esto, ¡pero estoy seguro de que me salvaste muchas más!
Steven
Debe responder su pregunta usted mismo, para que no aparezca en la lista sin respuesta :)
1
No tengo idea de cuánto tiempo me hubiera gastado esto, pero estoy bastante seguro de que hubiera sido un tiempo. Salvavidas.
Tom Manterfield
Todavía ahorrando horas y horas en 2020
Kyle
Me salvaste el tiempo. No sé cuántos días me quedé despierto toda la noche. Ja ... muchas gracias. Que tengas un buen día, te amo de verdad. Todavía ahorrando horas y horas en julio de 2020 !!!!!!!!!! lol
Tim

Respuestas:

30

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.

Rubén Durá Tarí
fuente
Esto es bonito. Ahora que awsebcli tiene eb ssh, descubrí que es más fácil ser vago en operaciones de desarrollo y hacer la limpieza a mano.
sahutchi
3
Aún respuesta relevante. Quería agregar eso (como un usuario novato de aws) puede simplemente agregar la etiqueta de comandos a sus archivos .ebextensions .config, en la parte superior de sus container_commands, y funcionará. Más sobre todas las etiquetas que se procesan aquí: enlace
sean.hudson
Hay dos problemas con esto: 1) solo funciona en la segunda implementación y en las siguientes, 2) sed sigue acumulando en la misma línea en el archivo de configuración cada vez que implementa. La solución de Manel Clos (la creación de un nuevo archivo en conf.d de Apache) no sufre estos problemas y también funciona cuando cambia las variables de entorno.
Mike Placentra
1
No he usado EB en un tiempo, pero estoy de acuerdo en que su solución es más limpia y elegante. Probablemente lo usaría si funciona correctamente, que debería.
Rubén Durá Tarí
Salvaste el fin de semana de mi equipo. ¡Muchas gracias!
Atul Mishra
63

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

Manel Clos
fuente
7
esta es una solución limpia. funciona cuando cambia las variables de entorno y no sigue agregando la misma línea en un archivo de configuración cada vez que implementa.
Mike Placentra
Recibiendo este error:not authorized to perform: rds:DescribeDBEngineVersions
Chirag Maliwal
34

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.

sahutchi
fuente
5
Parece que hablé demasiado pronto en mi comentario anterior. Si bien esto SÍ funciona para una implementación inicial, si cambia algo en su entorno (por ejemplo, agrega una nueva variable), esto no se ejecuta cuando se aplican esos cambios, y parece que wsgi.conf todavía se regenera. ¿Supongo que no conoce ninguna configuración de aplicación que se ejecute cada vez que se produce un cambio?
Tom Manterfield
Incluyo esto en cada git aws.push. Pero sí, a veces pierdo css cuando cambio parámetros. ¿Se rompería algo en su aplicación si después de realizar un cambio en su entorno volviera a implementar el último impulso a través de la interfaz de usuario en el menú de versión de la aplicación del entorno?
sahutchi
Parece que esta corrección ya no está actualizada. La respuesta finalista de Rubén Durá Tarí funciona (si corrige el error tipográfico) y parece a primera vista ser más robusta.
skolsuper
@skolsuper ¿cuál es el error tipográfico?
Nate
1
@Nate no hay uno. Cuando lo probé, tuve un problema no relacionado que sin darme cuenta solucioné al mismo tiempo que "corrigí" el error tipográfico. Rubén ha vuelto a editar su respuesta a un estado funcional desde mi bufonería.
skolsuper
0

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