Discrepancia en la codificación del hash de carga útil de DiscourseConnect

Hola,

Soy nuevo trabajando con Discourse y AWS, así que esperaba que alguien pudiera ayudarme o indicarme la dirección correcta. Estoy intentando configurar DiscourseConnect con mi sitio web, siguiendo las instrucciones de este foro https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045/1.

En el ejemplo del mundo real, cuando se genera el hash de la carga útil codificada en base64, obtengo un valor diferente al de la firma.
Carga útil: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI= (salto de línea omitido)
Firma: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56
Mi hash HMAC (generado con las herramientas en línea de devglan): 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

Cuando creo una firma para la URL de retorno, obtengo el mismo resultado que el sitio web, por lo que no estoy seguro de por qué las respuestas no coinciden. Si pudieran ofrecer alguna idea sobre la razón de esto, se lo agradecería mucho.

¿Puedes compartir un ejemplo de carga útil, el hash que obtienes y el secreto? (asegúrate de cambiar el secreto en tu sitio de prueba antes de publicarlo aquí)

Las nuevas líneas son importantes y afectan la firma. Parece que HMAC-SHA256 Generator Online elimina las nuevas líneas antes de calcular el hash. Podrías tener más suerte con otra herramienta como Free Online HMAC Generator / Checker Tool (MD5, SHA-256, SHA-512) - FreeFormatter.com

También, necesitas calcular el HMAC de la carga útil en base64 codificada en URL. Por lo tanto, nunca deberías calcular el hash de una carga útil que incluya una nueva línea sin codificar.

En su lugar, debería ser %0A. Si estás utilizando un framework web, ten en cuenta que podría haber descodificado la carga útil automáticamente. Necesitarás encontrar una manera de desactivar esto o volver a codificar el valor.

3 Me gusta

Aún no he probado esto en mi sitio web; estoy intentando deducir los pasos manualmente antes de hacerlo.

Según la publicación del foro mencionada anteriormente:

Dadas las siguientes configuraciones:
Dominio de Discourse: http://discuss.example.com
URL de DiscourseConnect: http://www.example.com/discourse/sso
Secreto de DiscourseConnect: d836444a9e4084d5b224a60c208dce14

Intento de inicio de sesión del usuario

  • Se genera un nonce: cb68251eefb5211e58c00ff1395f0c0b
  • Se genera la carga útil sin procesar: nonce=cb68251eefb5211e58c00ff1395f0c0b
  • La carga útil se codifica en Base64: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\n
  • La carga útil se codifica en URL: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D%0A
  • Se genera un HMAC-SHA256 sobre la carga útil codificada en Base64: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56

Aquí es donde obtengo una respuesta diferente. Cuando usé el codificador HMAC que sugeriste con la carga útil en Base64 sin codificar en URL, obtuve d26d5adf900de48890a0c3dcdeec108acd91b44a4b76c90c59955a5ba7b957f7 en lugar de 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56. Cuando lo usé con la carga útil codificada en URL, obtuve 46e749cd26dcabc84eed323ff31f830da674dc87c77a2fcb1b296f76402ea900.

Sin embargo, más adelante en el tutorial, durante la creación de la nueva carga útil:

Se genera la carga útil sin firmar:
nonce=cb68251eefb5211e58c00ff1395f0c0b&name=sam&username=samsam&email=test%40test.com&external_id=hello123&require_activation=true
(el orden no importa, los valores están codificados en URL)

La carga útil se codifica en Base64:
bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==

La carga útil se codifica en URL:
bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D

La carga útil codificada en Base64 se firma:
3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

Esta firma se genera a partir de la hash de la carga útil en Base64 sin codificar en URL, por eso tengo cierta duda sobre por qué no funciona con la primera carga útil.

¡Interesante! Tampoco puedo replicar la firma usando ese generador en línea. En Ruby, puedo hacer esto, lo cual funciona como se espera:

pry(main)> OpenSSL::HMAC.hexdigest("sha256", "d836444a9e4084d5b224a60c208dce14", "bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\n")
=> "2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56"

Por intuición, probé generar la firma para una cadena con un retorno de carro y un salto de línea al final (es decir, finales de línea estilo Windows), y logré obtener la misma firma que la herramienta de freeformatter.com

pry(main)> OpenSSL::HMAC.hexdigest("sha256", "d836444a9e4084d5b224a60c208dce14", "bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\r\n")
=> "200c03f1e5d7b859170be102b436d74f761040261be9682b4afec67eb908fabf"

Así que creo que lo mejor es evitar estas herramientas en línea e intentar una implementación mínima en el lenguaje de programación que vayas a utilizar.

6 Me gusta

¡Gracias por tu sugerencia! Codifiqué partes del proceso en JavaScript y, al probarlas (con las bibliotecas nodeForge, urlencode y js-base64) en RunKit, devolvió lo mismo que el tutorial.

3 Me gusta