Problemi con SSO e carattere '~'

Ciao a tutti,

Recentemente ho scoperto che se includo ‘~’ nella biografia di un utente, ottengo un errore di base64decode da Discourse. Può gestire correttamente tutti gli altri caratteri problematici (spazi, =, %, &) ma non ‘~’ per qualche motivo.

Qualcun altro ha riscontrato questo problema?

Il mio primo pensiero è che forse la mia codifica potrebbe essere errata, ma non sono riuscito a capirlo.

Ecco la mia implementazione Python della codifica:

return_payload = base64.urlsafe_b64encode(parse.urlencode(params).encode())

che viene poi inserito direttamente in ‘sso’ nelle richieste (insieme a tutte le altre informazioni necessarie)

resp = requests.post(
       ".../admin/users/sync_sso",
        data={'sso': return_payload, ...}
        headers={...}
)

Ho aggiornato il mio Discourse all’ultima versione (3.5.0.beta1-dev), ma il problema persiste.

Grazie per qualsiasi aiuto!

2 Mi Piace

Probabilmente dovrebbe essere risolto, ma quella domanda va oltre le mie competenze e capacità. Ma per pura curiosità pratica: perché qualcuno userebbe una tilde in una bio?

1 Mi Piace

Heh, immagino sia una domanda ragionevole.

Gestisco un forum multilingue e in altre culture ‘~’ viene spesso utilizzato. Ad esempio, in coreano, viene spesso usato alla fine per addolcire il tono, come “Se hai domande, fammelo sapere~”.

2 Mi Piace

Quindi questo è un bug report e non una richiesta di supporto?

1 Mi Piace

È così? Un bug è qualcosa che viene fatto, ma non funziona. Questo è più simile alla domanda “è fatto o no” e poi è più Feature se non è una domanda di supporto.

Sì, penso che Bug sia appropriato. Credo di codificarlo correttamente in base64, quindi anche discourse dovrebbe decodificarlo correttamente.

Penso che sia un bug (a condizione che possiamo riprodurlo)

2 Mi Piace

Sembra che urlsafe_b64encode sostituisca alcuni caratteri nella codifica base64. Dalla documentazione:

Codifica l’oggetto s simile a byte utilizzando l’alfabeto sicuro per URL e file system, che sostituisce - invece di + e _ invece di / nell’alfabeto Base64 standard e restituisce i byte codificati. Il risultato può ancora contenere =.

Ciò significa che il risultato non è base64 standard e non sarà compatibile con la decodifica di Discourse.

Consiglierei di utilizzare invece la normale funzione b64encode. La tua libreria HTTP dovrebbe occuparsi dell’escape degli URL, se necessario.

5 Mi Piace

Dopo ulteriori indagini, stavo effettivamente codificando in modo errato.

Ecco cosa ho finito per ottenere, per posterità:

return_payload = base64.b64encode(parse.urlencode(kwargs).encode("utf-8"))
h = hmac.new(secret.encode("utf-8"), return_payload, digestmod=hashlib.sha256)
resp = requests.post(
       ".../admin/users/sync_sso",
        data={"sso": return_payload, "sig": h.hexdigest()}
        headers={...}
)

E se stai facendo il reindirizzamento, assicurati di usare parse.urlencode per quel {"sso"…}.

Grazie per l’aiuto @sam e @david!

3 Mi Piace

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.