Error de inicio de sesión al intentar usar Discourse como proveedor de identidad (SSO, DiscourseConnect)

Estoy intentando seguir esta publicación: Use Discourse as an identity provider (SSO, DiscourseConnect) usando código Python. El código Python a continuación imprime una URL que, hasta donde puedo ver, debería estar correctamente firmada para acceder a https://forum.embeetle.com/session/sso_provider en mi instancia de Discourse, pero en su lugar, muestra solo el texto “Login Error”.

No hay ningún error en los registros en https://forum.embeetle.com/logs, así que no tengo idea de cómo resolver esto. ¿Significa esto que la firma es incorrecta? ¿Alguna otra sugerencia?

Por cierto, no te preocupes: cambiaré el secreto SSO tan pronto como se resuelva este problema.

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

Este código genera un enlace como el del comando curl a continuación:

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

Aquí hay una captura de pantalla de la configuración en el sitio:

¿Qué está mal o cómo puedo depurar esto?

Un paso más: si activo el registro detallado para DiscourseConnect, obtengo un error en los registros:

image

Registro SSO detallado: Error al analizar la firma Firma incorrecta para la carga útil sso: bm9uY2U9YklKeEU1WWw2OFhjSkJydGlwSU15UTRZeVlMeWd6ZzQyUU9mOFo0SWF5QSZyZXR1cm5fc3NvX3VybD1odHRwczovL2VtYmVldGxlLmNvbS8jYWNjb3VudA= 

Un punto notable es que la carga útil mencionada en el registro no está codificada en URL (observe el ‘=’ al final) y le falta el segundo ‘=’ de los datos codificados en URL (observe el %3D repetido al final de la carga útil original).

Entendido: la firma HMAC-SHA256 debe calcularse a partir de los datos codificados en base64, no de los datos codificados en url. Por lo tanto, el código correcto es:

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

Ahora, el resto del trabajo: manejar la redirección, verificar el nonce, etc. Continuará…

1 me gusta

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