Erreur de connexion lors de la tentative d'utilisation de Discourse comme fournisseur d'identité (SSO, DiscourseConnect)

J’essaie de suivre ce post : Use Discourse as an identity provider (SSO, DiscourseConnect) en utilisant du code Python. Le code Python ci-dessous imprime une URL qui – autant que je puisse en juger – devrait être correctement signée pour accéder à https://forum.embeetle.com/session/sso_provider sur mon instance Discourse, mais au lieu de cela, il affiche simplement le texte « Login Error ».

Il n’y a aucune erreur dans les journaux sur https://forum.embeetle.com/logs, donc je n’ai aucune idée de la façon de résoudre ce problème. Cela signifie-t-il que la signature est incorrecte ? D’autres suggestions ?

Au fait, ne vous inquiétez pas : je changerai le secret SSO dès que ce problème sera résolu.

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

Ce code génère un lien comme celui de la commande curl ci-dessous :

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

Voici une capture d’écran des paramètres sur le site :

Qu’est-ce qui ne va pas, ou comment puis-je déboguer cela ?

Un pas de plus : si j’active la journalisation détaillée pour DiscourseConnect, j’obtiens une erreur dans les journaux :

image

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

Un point notable est que la charge utile mentionnée dans le journal n’est pas encodée en URL (notez le ‘=’ à la fin) et qu’il manque le deuxième ‘=’ des données encodées en URL (notez le %3D répété à la fin de la charge utile d’origine).

Compris : la signature HMAC-SHA256 doit être calculée à partir des données encodées en base64, et non à partir des données encodées en URL. Le code correct est donc :

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

Maintenant, pour le reste du travail : gestion de la redirection, vérification du nonce, etc. À suivre…

1 « J'aime »

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