Selezione avatar utente tramite API non funziona più

Ciao a tutti. Sto usando l’SSO sul mio forum e gli avatar sono controllati dal mio sito web.

Fino a pochi giorni fa, il caricamento/aggiornamento dell’avatar dal sito web a Discourse, tramite API, funzionava. Ora ricevo un errore 422 - Unprocessable Entity.

Ho provato a eseguire il debug del problema, ho fatto alcuni test con Postman e ho gli stessi problemi. La richiesta che sto facendo è riportata di seguito (con URL, nome utente e api_key rimossi, ovviamente).

Qualcuno di voi sa se c’è qualche problema con questa parte di Discourse?

Grazie in anticipo.

Il mio esempio:

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"
}'

Qualcuno? C’è qualcuno che ha riscontrato lo stesso problema?

Questo è probabilmente correlato alla modifica dell’API per eseguire caricamenti diretti su S3?

Penso che ciò interferirebbe con l’upload effettivo, non con l’assegnazione dell’avatar all’utente.

Posso caricare il file senza problemi. Quando chiamo l’API per indicare quale file utilizzare come avatar, è lì che ricevo l’errore e questo è iniziato all’improvviso.

1 Mi Piace

Tento svoje šťastie a naposledy to podporím. Je zvláštne, že to nikto nenašiel. Som si istý, že to nie je problém s kódovaním, pretože to funguje už niekoľko rokov.

1 Mi Piace

Penso che ciò sia dovuto all’impostazione del sito discourse connect overrides avatar.

Sostituisce l’avatar dell’utente con il valore del payload di DiscourseConnect. Se abilitato, agli utenti non sarà consentito caricare avatar su Discourse.

Sul mio sistema locale con questa opzione deselezionata, ottengo una risposta http 200 durante l’aggiornamento dell’avatar tramite l’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

E ottengo un 422 con questa impostazione selezionata:

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 Mi Piace

Ciao Blake. Grazie per aver dato una mano.

Abilitarlo o disabilitarlo purtroppo non fa alcuna differenza.

1 Mi Piace

Non ho ancora una risposta, ma volevo solo farti sapere che questa è nella mia lista di cose da esaminare. Ho una configurazione SSO che posso testare localmente, in modo che le nostre impostazioni corrispondano. Sembra che dovremmo rispettare quell’impostazione del sito, il che potrebbe essere una modifica apportata di recente da qualcuno, ma forse potremmo aggiungere un’override API.

1 Mi Piace

Grazie mille, Blake. Fammi sapere se posso esserti d’aiuto in qualche modo.

1 Mi Piace

Un altro motivo per un 422 da quel metodo può essere se l’impostazione allow_uploaded_avatars è falsa. Scommetto che è quello il problema.

1 Mi Piace

Ciao Richard! Grazie per il tuo contributo.

Ci ho pensato anch’io ma non ha funzionato. Inoltre, questo problema è apparso dal nulla. Nessuno ha cambiato nulla (sono l’unico amministratore, quindi non c’è possibilità che qualcuno abbia modificato delle impostazioni), nessuna modifica al codice del sito web principale, niente.

Puoi dirmi cosa hai impostato per allow_uploaded_avatars? Non è più solo un’impostazione vero/falso, ma è impostata su un certo livello di fiducia. E puoi dirmi qual è il livello di fiducia dell’utente che sta cercando di cambiare il proprio avatar? E sei all’ultima versione di Discourse?

Ecco il codice per scegliere un avatar e le righe che restituiscono risposte 422.

Non che non possa essere qualcos’altro nel profondo del codebase, ma probabilmente è uno di questi 3. Il primo ha a che fare con discourse_connect_overrides_avatar e apparentemente lo abbiamo escluso. Non credo sia il secondo perché il tuo comando curl sembra corretto e include il tipo “uploaded”. Potrebbe ancora essere il terzo con l’impostazione allow_uploaded_avatars, motivo per cui vorrei sapere a cosa l’hai impostato.

L’avevo disabilitato fino all’inizio di questo problema. Poi l’ho impostato su 0: nuovo utente.

Ma averlo disabilitato ha sempre funzionato per me. Non voglio che gli utenti carichino dal forum, ma piuttosto dal sito web che utilizza SSO. Tuttavia, impostarlo su 0: nuovo utente non cambia nulla. Ricevo ancora lo stesso errore :frowning:

Non riesco a trovare alcun aggiornamento recente che possa aver impedito il funzionamento degli avatar tramite l’API quando tutte le impostazioni del sito li bloccano. Indipendentemente da ciò, se stai utilizzando SSO (o DiscourseConnect), dovresti utilizzare la route API /admin/users/sync_sso per aggiornare l’avatar degli utenti, non la route dell’interfaccia utente (/u/username/preferences/avatar/pick).

E passa questi parametri nel corpo della richiesta:

avatar_url: "url-of-image",
avatar_force_update: "true"

Ciao Blake. Ti ringrazio molto per il tuo continuo aiuto in merito.

Non riesco a trovare alcuna informazione su quell’endpoint nella documentazione dell’API. È qualcosa di nuovo?

Inoltre, come ho indicato in precedenza, l’aggiornamento dell’avatar ha funzionato correttamente per diversi mesi utilizzando l’endpoint /u/username/preferences/avatar/pick, il che è davvero strano. Ha semplicemente smesso di funzionare. Questo mi lascia davvero perplesso.

Sì, dovrebbe essere nella documentazione, non è una novità, è solo diverso da tutti gli altri endpoint.

Puoi trovare alcune informazioni qui: Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)

E anche come la gemma ruby discourse_api utilizza l’endpoint sync_sso: discourse_api/lib/discourse_api/single_sign_on.rb at main · discourse/discourse_api · GitHub e discourse_api/lib/discourse_api/api/sso.rb at main · discourse/discourse_api · GitHub

Dovrà utilizzare lo stesso segreto sso che il tuo provider sso sta utilizzando.

Grazie, Blake.

Non mi è ancora chiaro come le cose abbiano smesso di funzionare da sole e riceva errori 422 a destra e a manca, anche con quel punto di accesso.

Troverò una soluzione diversa.

Grazie mille per il tuo tempo.

1 Mi Piace