Anmeldefehler bei der Verwendung von Discourse als Identitätsanbieter (SSO, DiscourseConnect)

Ich versuche, diesem Beitrag zu folgen: Use Discourse as an identity provider (SSO, DiscourseConnect) mit Python-Code. Der unten stehende Python-Code gibt eine URL aus, die – soweit ich sehen kann – ordnungsgemäß signiert sein sollte, um auf https://forum.embeetle.com/session/sso_provider in meiner Discourse-Instanz zuzugreifen. Stattdessen wird nur der Text „Login Error“ angezeigt.

Es gibt keinen Fehler in den Protokollen unter https://forum.embeetle.com/logs, daher habe ich keine Ahnung, wie ich das beheben kann. Bedeutet das, dass die Signatur falsch ist? Irgendwelche anderen Vorschläge?

Übrigens: Keine Sorge, ich werde das SSO-Geheimnis ändern, sobald dieses Problem behoben ist.

import secrets
import base64
import urllib.parse
import hmac
import hashlib

forum_url = 'https://forum.embeetle.com'
target_url = 'https://embeetle.com/#account'
sso_secret = b'JCLSVcqbAnEPXz2p2xBY'

nonce = secrets.token_urlsafe()
payload = f'nonce={nonce}&return_ssourl={target_url}'
payload_base64 = base64.b64encode(payload.encode('utf-8')).decode()
payload_for_url = urllib.parse.quote(payload_base64)
signature = hmac.new(
    sso_secret, payload_for_url.encode('utf-8'), hashlib.sha256
).hexdigest()

print(f'{forum_url}/session/sso_provider?sso={payload_for_url}&sig={signature}')

Dieser Code generiert einen Link wie den im folgenden Curl-Befehl:

johan@morla:~/sa> curl 'https://forum.embeetle.com/session/sso_provider?sso=bm9uY2U9bExhRUZjRGFVd0NrNTFkMEVOeGc5dUtKZ0kwNHZNYng5VkpFR0RqRUg0OCZyZXR1cm5fc3NvX3VybD1odHRwczovL2VtYmVldGxlLmNvbS8jYWNjb3VudA%3D%3D&sig=70e647a1baad2e09ef6cdc6d87fae70bc27c6823369be20fd1b11ea536180343'
Login Errorjohan@morla:~/sa> 

Hier ist ein Screenshot der Einstellungen auf der Website:

Was ist falsch oder wie kann ich das debuggen?

Ein Schritt weiter: Wenn ich die ausführliche Protokollierung für DiscourseConnect aktiviere, erhalte ich einen Fehler in den Protokollen:

image

Verbose SSO log: Signature parse error Bad signature for payload sso: bm9uY2U9YklKeEU1WWw2OFhjSkJydGlwSU15UTRZeVlMeWd6ZzQyUU9mOFo0SWF5QSZyZXR1cm5fc3NvX3VybD1odHRwczovL2VtYmVldGxlLmNvbS8jYWNjb3VudA= 

Ein bemerkenswerter Punkt ist, dass die im Protokoll erwähnte Nutzlast nicht URL-codiert ist (beachten Sie das ‘=’ am Ende) und das zweite ‘=’ der URL-codierten Daten fehlt (beachten Sie das wiederholte %3D am Ende der ursprünglichen Nutzlast).

Verstanden: Die HMAC-SHA256-Signatur muss aus den base64-codierten Daten berechnet werden, nicht aus den URL-codierten Daten. Der korrekte Code lautet also:

import secrets
import base64
import urllib.parse
import hmac
import hashlib

forum_url = 'https://forum.embeetle.com'
target_url = 'https://embeetle.com/#account'
sso_secret = b'JCLSVcqbAnEPXz2p2xBY'

nonce = secrets.token_urlsafe()
payload = f'nonce={nonce}&return_sso_url={target_url}'
payload_base64 = base64.b64encode(payload.encode('utf-8')).decode()
payload_for_url = urllib.parse.quote(payload_base64)

signature = hmac.new(
    sso_secret, payload_base64.encode('utf-8'), hashlib.sha256
).hexdigest()

print(f'{forum_url}/session/sso_provider?sso={payload_for_url}&sig={signature}')

Nun zum Rest der Arbeit: Behandlung der Weiterleitung, Überprüfung des Nonce usw. Fortsetzung folgt …

1 „Gefällt mir“

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