Errore di accesso durante il tentativo di utilizzo di Discourse come provider di identità (SSO, DiscourseConnect)

Sto cercando di seguire questo post: Use Discourse as an identity provider (SSO, DiscourseConnect) usando il codice Python. Il codice Python qui sotto stampa un URL che - per quanto ne so - dovrebbe essere correttamente firmato per accedere a https://forum.embeetle.com/session/sso_provider sulla mia istanza Discourse, ma invece mostra solo il testo “Login Error”.

Non ci sono errori nei log su https://forum.embeetle.com/logs, quindi non ho idea di come risolvere questo problema. Ciò significa che la firma non è corretta? Qualsiasi altro suggerimento?

A proposito, non preoccuparti: cambierò il segreto SSO non appena questo problema sarà risolto.

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_for_url.encode('utf-8'), hashlib.sha256
).hexdigest()

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

Questo codice genera un link simile a quello nel comando curl qui sotto:

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

Ecco uno screenshot delle impostazioni sul sito:

Cosa c’è che non va, o come posso fare il debug di questo?

Un passo avanti: se attivo il logging dettagliato per DiscourseConnect, ottengo un errore nei log:

image

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

Un punto degno di nota è che il payload menzionato nel log non è codificato in URL (notare il ‘=’ alla fine) e manca il secondo ‘=’ dei dati codificati in URL (notare il %3D ripetuto alla fine del payload originale).

Capito: la firma HMAC-SHA256 deve essere calcolata dai dati codificati in base64, non dai dati codificati in url. Quindi il codice corretto è:

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}')

Ora per il resto del lavoro: gestione del reindirizzamento, controllo del nonce, ecc. Da continuare…

1 Mi Piace

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