Problèmes avec SSO et le caractère '~'

Salut tout le monde,

J’ai récemment découvert que si j’inclus ‘~’ dans la bio d’un utilisateur, j’obtiens une erreur base64decode de Discourse. Il peut gérer toutes sortes d’autres caractères problématiques sans problème (espaces, =, %, &) mais pas ‘~’ pour une raison quelconque.

Quelqu’un d’autre a-t-il rencontré ce problème ?

Ma première pensée est que mon encodage pourrait être erroné, mais je n’ai pas réussi à le comprendre.

Voici mon implémentation Python de l’encodage :

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

qui est ensuite directement placé dans ‘sso’ dans les requêtes (avec toutes les autres informations nécessaires)

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

J’ai mis à jour mon Discourse vers la dernière version (3.5.0.beta1-dev), le problème persiste.

Merci pour toute aide !

2 « J'aime »

Il devrait probablement être corrigé, mais cette question dépasse mes compétences et mes capacités. Mais par pure curiosité pratique : pourquoi quelqu’un utiliserait-il un tilde dans une bio ?

1 « J'aime »

Heh, je suppose que c’est une question raisonnable.

J’administre un forum multilingue et dans d’autres cultures, le symbole ‘~’ est fréquemment utilisé. Par exemple, en coréen, il est souvent utilisé à la fin pour adoucir le ton, comme dans « Si vous avez des questions, faites-le moi savoir~ ».

2 « J'aime »

Ceci est donc un rapport de bug et non une demande de support ?

1 « J'aime »

Est-ce le cas ? Un bug est quelque chose qui est fait, mais qui ne fonctionne pas. Ceci ressemble plus à une question « est-ce fait ou pas » et alors c’est plutôt une #fonctionnalité si ce n’est pas une question de support.

Oui, je pense que Bug est approprié. Je pense que je l’encode correctement en base64, donc Discourse devrait également le décoder correctement.

Je pense que c’est un bug (à condition que nous puissions le reproduire)

2 « J'aime »

Il semble que urlsafe_b64encode remplace certains caractères dans l’encodage base64. D’après la documentation :

Encode un objet s similaire à des octets en utilisant l’alphabet sûr pour l’URL et le système de fichiers, qui substitue - au lieu de + et _ au lieu de / dans l’alphabet Base64 standard, et retourne les octets encodés. Le résultat peut encore contenir =.

Cela signifie que le résultat n’est pas du base64 standard et ne sera pas compatible avec le décodage de Discourse.

Je recommanderais d’utiliser plutôt la fonction b64encode normale. Votre bibliothèque HTTP devrait s’occuper de l’échappement d’URL si nécessaire.

5 « J'aime »

Après une enquête plus approfondie, je l’encodais effectivement mal.

Voici ce que j’ai fini par obtenir, pour la postérité :

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={...}
)

Et si vous effectuez la redirection, assurez-vous de faire un parse.urlencode de ce {“sso”…}.

Merci pour votre aide @sam et @david !

3 « J'aime »

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