La selección de avatar de usuario a través de la API ya no funciona

Hola a todos. Estoy usando SSO en mi foro y los avatares son controlados por mi sitio web.

Hasta hace unos días, la carga/actualización de avatares desde el sitio web a Discourse, a través de la API, funcionaba. Ahora obtengo un error 422 - Unprocessable Entity.

He intentado depurar el problema, he hecho algunas pruebas con Postman y tengo los mismos problemas. La solicitud que estoy haciendo está a continuación (con la URL, el nombre de usuario y la api_key eliminados, por supuesto).

¿Alguno de ustedes sabe si hay algún problema con esta parte de Discourse?

Gracias de antemano.

Mi ejemplo:

curl --location --request PUT 'https://{{URL}}/u/{{USERNAME}}/preferences/avatar/pick' \
--header 'Api-Key: {{API_KEY}}' \
--header 'Api-Username: system' \
--header 'Content-Type: application/json' \
--data-raw '{
"upload_id": 972,
"type": "uploaded"
}'

¿Alguien? ¿No hay nadie que haya encontrado el mismo problema?

¿Esto está relacionado con el cambio en la API para realizar cargas directas a S3?

Creo que eso interferiría con la carga real, no con la asignación del avatar al usuario.

Puedo cargar el archivo sin ningún problema. Cuando hago la llamada a la API para indicar qué archivo usar como avatar, ahí es donde obtengo el error y eso comenzó de la nada.

1 me gusta

Estoy probando mi suerte y le daré un último impulso. Es extraño que nadie lo haya encontrado. Estoy seguro de que no es un problema de codificación, ya que ha estado funcionando durante más de un par de años.

1 me gusta

Creo que esto se debe a la configuración del sitio discourse connect overrides avatar.

Anula el avatar del usuario con el valor de la carga útil de DiscourseConnect. Si está habilitado, no se permitirá a los usuarios subir avatares en Discourse.

En mi entorno local, con esa opción desmarcada, obtengo una respuesta http 200 al actualizar el avatar a través de la API:

curl -i -sS -X PUT "http://localhost:4200/u/10614bb2d4eacd328c45/preferences/avatar/pick.json"  \
-H "Content-Type: multipart/form-data"  \
-H "Api-Key: 6cea489d21282803c446fd2e9d236901c3d186f36079911833db4b57c43c01d5"  \
-H "Api-Username: blake.erickson"  \
-F "upload_id=57"  \
-F "type=uploaded"

HTTP/1.1 200 OK

Y obtengo un 422 con esa configuración marcada:

curl -i -sS -X PUT "http://localhost:4200/u/021ca796a01ad178bc52/preferences/avatar/pick.json"  \
-H "Content-Type: multipart/form-data"  \
-H "Api-Key: 6cea489d21282803c446fd2e9d236901c3d186f36079911833db4b57c43c01d5"  \
-H "Api-Username: blake.erickson"  \
-F "upload_id=57"  \
-F "type=uploaded"

HTTP/1.1 422 Unprocessable Entity
1 me gusta

Hola Blake. Gracias por tu ayuda.

Activarla o desactivarla no marca ninguna diferencia, desafortunadamente.

1 me gusta

Todavía no tengo una respuesta, pero solo quería informarte que esto está en mi lista para investigarlo. Tengo una configuración de SSO que puedo probar localmente, para que nuestra configuración coincida. Parece que deberíamos respetar esa configuración del sitio, lo que podría ser un cambio que alguien hizo recientemente, pero tal vez podríamos agregar una anulación de API.

1 me gusta

Muchas gracias, Blake. Por favor, házmelo saber si hay algo en lo que pueda ayudar.

1 me gusta

Otra razón para un 422 de ese método puede ser si la configuración allow_uploaded_avatars es falsa. Apuesto a que ese es el problema.

1 me gusta

¡Hola Richard! Gracias por tu aporte.

Yo también lo pensé, pero no funcionó. Además, este problema apareció de la nada. Nadie cambió nada (soy el único administrador, así que no hay posibilidad de que alguien haya cambiado alguna configuración), ningún cambio de código en el sitio web principal, nada.

¿Puede informarme qué tiene configurado para allow_uploaded_avatars? Ya no es solo una configuración de verdadero/falso, sino que se establece en un cierto nivel de confianza. Y ¿puede informarme cuál es el nivel de confianza del usuario que intenta cambiar su avatar? ¿Y está en la última versión de Discourse?

Aquí está el código para elegir un avatar y las líneas que devuelven respuestas 422.

No es que no pueda ser algo más profundo en la base de código, pero probablemente sea uno de estos 3. El primero tiene que ver con discourse_connect_overrides_avatar y aparentemente lo descartamos. No creo que sea el segundo porque su comando curl parece correcto e incluye el tipo “uploaded”. Posiblemente todavía podría ser el tercero con la configuración allow_uploaded_avatars, que es por lo que me gustaría saber qué tiene configurado.

Lo tenía deshabilitado hasta que comenzó este problema. Luego lo cambié a 0:usuario nuevo.

Pero tenerlo deshabilitado siempre me funcionó. No quiero que los usuarios suban desde el foro, sino desde el sitio web que utiliza SSO. Aun así, cambiarlo a 0:usuario nuevo no cambia nada. Todavía obtengo el mismo error :frowning:

No puedo encontrar ninguna actualización reciente que haya impedido que los avatares funcionen a través de la API cuando todas las configuraciones del sitio los bloquean. De todos modos, si está utilizando SSO (o DiscourseConnect), debería utilizar la ruta de la API /admin/users/sync_sso para actualizar el avatar de los usuarios, no la ruta de la interfaz de usuario (/u/username/preferences/avatar/pick).

Y pase estos parámetros en el cuerpo de la solicitud:

avatar_url: "url-de-la-imagen",
avatar_force_update: "true"

Hola Blake. Muchas gracias por tu continua ayuda en este asunto.

No encuentro información sobre ese endpoint en la documentación de la API. ¿Es algo nuevo?

Además, como indiqué antes, la actualización del avatar funcionó bien durante varios meses utilizando el endpoint /u/username/preferences/avatar/pick, lo cual es muy extraño. Simplemente dejó de funcionar. Eso realmente me desconcierta.

Sí, realmente debería estar en la documentación, no es nuevo, es solo diferente a todos los demás puntos finales.

Puedes encontrar información aquí: Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)

Y también cómo el gem ruby discourse_api usa el punto final sync_sso: discourse_api/lib/discourse_api/single_sign_on.rb at main · discourse/discourse_api · GitHub y discourse_api/lib/discourse_api/api/sso.rb at main · discourse/discourse_api · GitHub

Necesitará usar el mismo secreto sso que está utilizando su proveedor sso.

Gracias, Blake.

Todavía no entiendo que las cosas dejaran de funcionar por sí solas y que reciba errores 422 por todas partes, incluso con ese endpoint.

Intentaré encontrar una solución diferente.

Muchas gracias por tu tiempo.

1 me gusta