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í)
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.
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.
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
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.
¡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.