DiscourseConnect Payload Hash-Kodierung-Fehlübereinstimmung

Hallo,

ich arbeite neu mit Discourse und AWS und hoffe, dass mir jemand helfen oder mich in die richtige Richtung lenken kann. Ich versuche, DiscourseConnect mit meiner Website einzurichten, und folge dabei den Anweisungen in diesem Forum: https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045/1

Im Praxisbeispiel erhalte ich beim Hashen des Base64-codierten Payloads einen anderen Wert als die Signatur.
Payload: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI= (Zeilenwechsel weggelassen)
Signatur: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56
Mein HMAC-Hash (generiert mit den Online-Tools von devglan): 1ce1494f94484b6f6a092be9b15ccc1cdafb1f8460a3838fbb0e0883c4390471

Wenn ich eine Signatur für die Rückgabe-URL erstelle, erhalte ich dasselbe Ergebnis wie die Website. Daher bin ich mir nicht ganz sicher, warum die Werte nicht übereinstimmen. Falls Sie mir erklären können, woran das liegt, wäre ich Ihnen sehr dankbar.

Können Sie ein Beispiel für einen Payload, den erhaltenen Hash und das Geheimnis teilen? (Achten Sie darauf, das Geheimnis auf Ihrer Testseite zu ändern, bevor Sie es hier veröffentlichen.)

Zeilenumbrüche sind wichtig und beeinflussen die Signatur. Es sieht so aus, als ob HMAC-SHA256 Generator Online Zeilenumbrüche entfernt, bevor der Hash berechnet wird. Vielleicht haben Sie mit einem anderen Tool wie Free Online HMAC Generator / Checker Tool (MD5, SHA-256, SHA-512) - FreeFormatter.com mehr Erfolg.

Außerdem müssen Sie den HMAC des URL-kodierten Base64-Payloads berechnen. Sie sollten also niemals den Hash eines Payloads berechnen, der einen rohen Zeilenumbruch enthält.

Stattdessen sollte es %0A sein. Wenn Sie ein Web-Framework verwenden, bedenken Sie, dass es den Payload möglicherweise automatisch dekodiert hat. Sie müssen einen Weg finden, dies zu deaktivieren, oder den Wert erneut kodieren.

3 „Gefällt mir“

Ich habe das noch nicht auf meiner Website getestet. Ich versuche zunächst, die Schritte manuell nachzuvollziehen.

Aus dem zuvor erwähnten Forenbeitrag:

Gegeben folgende Einstellungen:
Discourse-Domain: http://discuss.example.com
DiscourseConnect-URL: http://www.example.com/discourse/sso
DiscourseConnect-Geheimnis: d836444a9e4084d5b224a60c208dce14

Benutzer versucht sich einzuloggen

  • Nonce wird generiert: cb68251eefb5211e58c00ff1395f0c0b
  • Roher Payload wird generiert: nonce=cb68251eefb5211e58c00ff1395f0c0b
  • Payload wird Base64-kodiert: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI=\n
  • Payload wird URL-kodiert: bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGI%3D%0A
  • HMAC-SHA256 wird auf dem Base64-kodierten Payload generiert: 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56

Hier erhalte ich ein anderes Ergebnis. Als ich den von dir vorgeschlagenen HMAC-Encoder für den Base64-kodierten, nicht URL-kodierten Payload verwendete, erhielt ich d26d5adf900de48890a0c3dcdeec108acd91b44a4b76c90c59955a5ba7b957f7 anstelle von 2828aa29899722b35a2f191d34ef9b3ce695e0e6eeec47deb46d588d70c7cb56. Wenn ich ihn auf den URL-kodierten Payload anwende, erhalte ich 46e749cd26dcabc84eed323ff31f830da674dc87c77a2fcb1b296f76402ea900.

Später im Tutorial jedoch, bei der Erstellung des neuen Payloads:

Unsignierter Payload wird generiert:
nonce=cb68251eefb5211e58c00ff1395f0c0b&name=sam&username=samsam&email=test%40test.com&external_id=hello123&require_activation=true
(Reihenfolge ist egal, Werte sind URL-kodiert)

Payload wird Base64-kodiert
bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ==

Payload wird URL-kodiert
bm9uY2U9Y2I2ODI1MWVlZmI1MjExZTU4YzAwZmYxMzk1ZjBjMGImbmFtZT1zYW0mdXNlcm5hbWU9c2Ftc2FtJmVtYWlsPXRlc3QlNDB0ZXN0LmNvbSZleHRlcm5hbF9pZD1oZWxsbzEyMyZyZXF1aXJlX2FjdGl2YXRpb249dHJ1ZQ%3D%3D

Der Base64-kodierte Payload wird signiert
3d7e5ac755a87ae3ccf90272644ed2207984db03cf020377c8b92ff51be3abc3

Diese Signatur wird durch Hashing des Base64-kodierten, nicht URL-kodierten Payloads erzeugt. Daher bin ich etwas unsicher, warum das beim ersten Payload nicht funktioniert.

Interessant! Ich kann die Signatur mit diesem Online-Generator ebenfalls nicht nachvollziehen. In Ruby kann ich Folgendes tun, was wie erwartet funktioniert:

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

Aus einer Ahnung heraus habe ich versucht, die Signatur für einen String mit einem Carriage Return und einem Zeilenumbruch am Ende (d. h. Windows-Zeilenumbrüche) zu generieren, und es ist mir gelungen, dieselbe Signatur wie beim Tool freeformatter.com zu erhalten:

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

Daher denke ich, dass es am besten ist, diese Online-Tools zu vermeiden und stattdessen eine minimale Implementierung in der Programmiersprache zu versuchen, die du verwenden möchtest.

6 „Gefällt mir“

Vielen Dank für deinen Vorschlag! Ich habe Teile des Prozesses in JavaScript implementiert und beim Testen (mit den Bibliotheken nodeForge, urlencode und js-base64) in RunKit wurde dasselbe Ergebnis wie im Tutorial zurückgegeben.

3 „Gefällt mir“