Problemas con SSO y el carácter '~'

Hola a todos,

Recientemente descubrí que si incluyo ‘~’ en la biografía de un usuario, obtengo un error de base64decode de Discourse. Puede manejar todo tipo de otros caracteres problemáticos sin problemas (espacios, =, %, &), pero no ‘~’ por alguna razón.

¿Alguien más ha encontrado este problema?

Mi primer pensamiento es que quizás mi codificación sea incorrecta, pero no he podido resolverlo.

Aquí está mi implementación en Python de la codificación:

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

que luego se inserta directamente en ‘sso’ en las solicitudes (junto con toda la otra información necesaria)

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

He actualizado mi Discourse a la versión más reciente (3.5.0.beta1-dev), pero el problema persiste.

¡Gracias por cualquier ayuda!

2 Me gusta

Probablemente debería arreglarse, pero esa pregunta está por encima de mis posibilidades y habilidades. Pero por pura curiosidad práctica: ¿por qué alguien usaría una tilde en una biografía?

1 me gusta

Supongo que es una pregunta razonable.

Dirijo un foro multilingüe y en otras culturas se usa con frecuencia el ‘~’. Por ejemplo, en coreano, a menudo se usa al final para suavizar el tono, como “Si tienes alguna pregunta, házmelo saber~”.

2 Me gusta

¿Así que esto es un informe de error y no una solicitud de soporte?

1 me gusta

¿Lo es? Un error es algo que se hace, pero no funciona. Esto se parece más a la pregunta “¿está hecho o no?” y entonces es más Feature si no es una pregunta de soporte.

Sí, creo que Bug es apropiado. Creo que lo estoy codificando en base64 correctamente, por lo que discourse también debería decodificarlo correctamente.

Creo que es un error (si podemos reproducirlo)

2 Me gusta

Parece que urlsafe_b64encode reemplaza algunos caracteres en la codificación base64. De la documentación:

Codifica el objeto similar a bytes bytes-like object s usando el alfabeto seguro para URL y sistemas de archivos, que sustituye - en lugar de + y _ en lugar de / en el alfabeto Base64 estándar, y devuelve los bytes codificados. El resultado aún puede contener = .

Eso significa que el resultado no es base64 estándar y no será compatible con la decodificación de Discourse.

Recomiendo usar la función b64encode normal en su lugar. Su biblioteca HTTP debería encargarse del escape de URL si es necesario.

5 Me gusta

Tras una mayor investigación, de hecho lo estaba codificando mal.

Esto es lo que terminé, para que conste:

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

Y si estás haciendo la redirección, asegúrate de usar parse.urlencode para eso de {"sso"…}.

¡Gracias por la ayuda @sam y @david!

3 Me gusta

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