خطأ في تسجيل الدخول أثناء محاولة استخدام Discourse كموفر هوية (SSO، DiscourseConnect)

أحاول اتباع هذا المنشور: Use Discourse as an identity provider (SSO, DiscourseConnect) باستخدام كود بايثون. الكود التالي في بايثون يطبع رابطًا - على حد علمي - يجب أن يكون موقعًا بشكل صحيح للوصول إلى https://forum.embeetle.com/session/sso_provider على مثيل Discourse الخاص بي، ولكنه بدلاً من ذلك يعرض النص “Login Error” فقط.

لا يوجد خطأ في السجلات على https://forum.embeetle.com/logs، لذلك ليس لدي أي فكرة عن كيفية حل هذه المشكلة. هل هذا يعني أن التوقيع غير صحيح؟ أي اقتراحات أخرى؟

بالمناسبة، لا تقلق: سأقوم بتغيير مفتاح SSO السري بمجرد حل هذه المشكلة.

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

ينشئ هذا الكود رابطًا مثل الرابط الموجود في أمر curl أدناه:

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

هذه لقطة شاشة للإعدادات على الموقع:

ما هو الخطأ، أو كيف يمكنني تصحيح هذا؟

خطوة أخرى: إذا قمت بتشغيل تسجيل مفصل لـ DiscourseConnect، أحصل على خطأ في السجلات:

image

تسجيل مفصل لـ SSO: خطأ في تحليل التوقيع توقيع سيء للحمولة sso: bm9uY2U9YklKeEU1WWw2OFhjSkJydGlwSU15UTRZeVlMeWd6ZzQyUU9mOFo0SWF5QSZyZXR1cm5fc3NvX3VybD1odHRwczovL2VtYmVldGxlLmNvbS8jYWNjb3VudA= 

تجدر الإشارة إلى أن الحمولة المذكورة في السجل ليست مشفرة بـ URL (لاحظ علامة ‘=’ في النهاية) وتفتقد علامة ‘=’ الثانية للبيانات المشفرة بـ URL (لاحظ تكرار %3D في نهاية الحمولة الأصلية).

فهمت: يجب حساب توقيع HMAC-SHA256 من البيانات المشفرة بـ base64، وليس من البيانات المشفرة بـ url. لذا فإن الرمز الصحيح هو:

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

الآن لبقية العمل: التعامل مع إعادة التوجيه، والتحقق من الـ nonce، وما إلى ذلك. يتبع …

إعجاب واحد (1)

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