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 ibytecodificati. 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.