No exemplo do mundo real, quando o payload codificado em base64 é hashado, obtenho um valor diferente da assinatura.
Payload: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI= (quebra de linha omitida)
Assinatura: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56
Meu Hash HMAC (gerado a partir das ferramentas online do devglan): 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471
Quando crio uma assinatura para a URL de retorno, obtenho o mesmo resultado que o site, então não tenho certeza do motivo pelo qual as respostas não coincidem. Se puderem fornecer qualquer insight sobre o motivo disso, seria muito apreciado.
Você pode compartilhar um exemplo de payload, o hash que você obteve e o segredo? (certifique-se de alterar o segredo no seu site de teste antes de postá-lo aqui)
Também, você precisa calcular o HMAC do payload em base64 URL-encoded. Portanto, você nunca deve calcular o hash de um payload que inclua uma nova linha bruta.
Em vez disso, deve ser %0A. Se você estiver usando um framework web, lembre-se de que ele pode ter decodificado o payload automaticamente. Você precisará encontrar uma maneira de desativar isso ou re-codificar o valor.
Ainda não testei isso no meu site; estou tentando entender os passos manualmente antes de fazê-lo.
Da postagem no fórum mencionada anteriormente:
Dadas as seguintes configurações:
Domínio do Discourse: http://discuss.example.com
URL do DiscourseConnect: http://www.example.com/discourse/sso
Segredo do DiscourseConnect: d836444a9e4084d5b224a60c208dce14
Tentativa de login do usuário
Um nonce é gerado: cb68251eefb5211e58c00ff1395f0c0b
A carga bruta (raw payload) é gerada: nonce=cb68251eefb5211e58c00ff1395f0c0b
A carga é codificada em Base64: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\n
A carga é codificada em URL: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D%0A
Um HMAC-SHA256 é gerado na carga codificada em Base64: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56
É aqui que obtenho um resultado diferente. Quando usei o codificador HMAC que você sugeriu na carga em Base64 não codificada em URL, obtive d26d5adf900de48890a0c3dcdeec108acd91b44a4b76c90c59955a5ba7b957f7 em vez de 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56. Quando o uso na carga codificada em URL, obtenho 46e749cd26dcabc84eed323ff31f830da674dc87c77a2fcb1b296f76402ea900.
No entanto, mais adiante no tutorial, durante a criação da nova carga:
A carga não assinada é gerada: nonce=cb68251eefb5211e58c00ff1395f0c0b&name=sam&username=samsam&email=test%40test.com&external_id=hello123&require_activation=true
(a ordem não importa, os valores estão codificados em URL)
A carga é codificada em Base64 bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==
A carga é codificada em URL bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D
A carga codificada em Base64 é assinada 3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3
Essa assinatura é gerada a partir do hash da carga em Base64 não codificada em URL, por isso estou um pouco inseguro quanto ao motivo de não funcionar na primeira carga.
Por um palpite, tentei gerar a assinatura para uma string com um retorno de carro e uma quebra de linha no final (ou seja, terminadores de linha no estilo Windows), e consegui obter a mesma assinatura que a ferramenta freeformatter.com
Portanto, acho que a melhor coisa a fazer é evitar essas ferramentas online e tentar uma implementação mínima na linguagem de programação que você for usar.
Obrigado pela sua sugestão! Codifiquei partes do processo em JavaScript e, ao testá-las (com as bibliotecas nodeForge, urlencode e js-base64) no RunKit, o resultado foi o mesmo do tutorial.