أحاول استدعاء عنوان URL خارجي لتسجيل الدخول إلى موقع بعيد بعد أن يسجل المستخدمون دخولهم إلى Discourse. كل ما أحتاجه هو إعادة التوجيه إلى عنوان URL على الموقع البعيد، الذي يقوم بتسجيل الدخول هناك، ثم يعيد التوجيه مرة أخرى إلى Discourse. عندما أفعل ذلك، يرفض المتصفح إعادة التوجيه بسبب CORS:
Access to XMLHttpRequest at 'https://SITE/api/sso/v2/sso/jwt?' (redirected from 'https://testing.literatehosting.com/session') from origin 'https://testing.literatehosting.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
يقول مطورو التطبيق إن ذلك لأنني أقوم بإعادة التوجيه بشكل خاطئ (على سبيل المثال، باستخدام استدعاء ajax؟)، لكن هذا يبدو مطابقًا لما أراه في الالتزامات المذكورة هنا.
أنا محير (مرة أخرى).
لا أستطيع أن أقرر ما إذا كنت أجهل حقًا أو ما إذا كان عليهم إرسال رؤوس Access-Control-Allow-Origin (وفي هذه الحالة، كيف يمكن أن يعمل هذا مع أي من عملائهم؟ وهذا يبدو بعيد المنال).
إليك الكود الخاص بي:
after_initialize do
class ::SessionController
def login(user)
puts "\n\n\n\LOGIN happening!\n\n\n\n"
session.delete(ACTIVATE_USER_KEY)
log_on_user(user)
if payload = cookies.delete(:sso_payload)
sso_provider(payload)
else
if true # plugin is enabled and has api key and url
sign_into_thinkific(user)
else
render_serialized(user, UserSerializer)
end
end
end
def sign_into_thinkific(user)
# do stuff to generate payload
redirect_to thinkific_sso_url(payload) # also tried redirect_to
generate_url(thinkific_sso_url(payload))
end
def generate_url(url, params = {})
puts "\n\n\nGenerate URL: #{url}\n\n\n"
uri = URI(url)
uri.query = params.to_query
uri.to_s
end
def thinkific_sso_url(payload)
current_url="https://#{GlobalSetting.hostname}/"
url = "https://#{SiteSetting.thinkific_site_url}/api/sso/v2/sso/jwt?jwt=#{payload}"
url += "&return_to=#{URI.escape(current_url)}"
url
end
end
end
تعديل: شارك المطورون تطبيق Rails يستخدم redirect_to تمامًا كما أفعل، ويدّعون أنه يعمل. هل هناك شيء في Discourse يجعله يتصرف بشكل مختلف مع redirect_to لأنه… داخل Ember، أو شيء من هذا القبيل؟
إذا حفظت النص الموجود في redirect_location في ملف وفتحه في متصفحي، فسأتم تسجيل الدخول إلى Thinkific وسيتم إعادة توجيهي إلى Discourse. للأسف، لا يعمل نفس الشيء عند النقر على تسجيل الدخول في متصفحي.
أعتذر لأنني أستدعيك يا @sam، لكنني أشعر بأن هناك شيئًا خاصًا بمنصة Discourse وسريعًا يمكنك مساعدتي فيه، بينما أعمل على هذا الأمر منذ أسبوعين.
نجح شغلي البرمجي من خلال إضافة وسيط في المنتصف، لكن هذا لا يبدو حلًا جيدًا.
عندما أحاول استخدام redirect_to لإعادة التوجيه إلى موقع خارجي في SessionController الذي أقوم بتعديله، أواجه خطأ CORS. يبدو أن الكود نفسه من Thinkific لا يواجه هذه المشكلة. هل هناك شيء خاص بإجراء إعادة التوجيه من داخل site_url/session؟ هل عليّ تنفيذ إعادة التوجيه عبر JavaScript بطريقة ما؟ إذا كان الأمر كذلك، هل يمكنك توجيهي بشكل عام حول كيفية عمل ذلك؟
إنه يعيد التوجيه بالفعل، لكنه يولد انتهاكًا لسياسة CORS. الأمر غريب لأن إعادة التوجيه التي تبدو مطابقة تمامًا لا تسبب انتهاكًا لسياسة CORS في كود Rails النموذجي الخاص بهم. كنت أأمل أن يكون هناك شيء خاص في القيام بذلك داخل Ember، أو شيء من هذا القبيل.
إذن، انتهت آمالي في أن يكون الأمر شيئًا تافهًا وواضحًا.
أنا متأكد إلى حد كبير أنه نظرًا لأن نافذة تسجيل الدخول تتم عبر AJAX (في base_url/session)، فإن المتصفح يرفض إجراء redirect_to ما لم يرسل الطرف الآخر رؤوس CORS.
ما أعتقد أنني أحتاجه هو طريقة ما (ولا أعرف كيف أصف ذلك) للخروج من AJAX بحيث يبدو للمتصفح وكأنه إعادة توجيه عادية، وليس إعادة توجيه داخل AJAX.
أو، هل هناك طريقة ما لجعل صفحة تسجيل الدخول غير معتمدة على AJAX؟
هل نجحت في حل هذه المشكلة؟ أواجه نفس المشكلة عند استخدام تسجيل الدخول عبر SSS الخاص بـ Discourse من واجهة برمجة تطبيقات ASP.NET Core.
تقوم متصفح تطبيق Angular بإرجاع خطأ “رأس التحكم في القبول” غير موجود بمجرد إعادة توجيه الطلب من واجهة البرمجة إلى تطبيق Angular (بعد أن يرسل Discourse الرد بنجاح).
تطبيق Angular → واجهة برمجة تطبيقات ASP.NET → استدعاءات واجهة البرمجة لـ Discourse SSO → يعيد Discourse القيم إلى خادم واجهة برمجة تطبيقات ASP.NET → يعيد خادم واجهة البرمجة توجيه الاتصال مرة أخرى إلى عنوان URL لتطبيق Angular → يقوم المتصفح بإرجاع خطأ بأن عنوان URL الخاص بـ Discourse غير متاح بسبب عدم وجود “رأس التحكم في الوصول إلى المصدر”.
تمت إعداد جميع إعدادات CORS على Discourse بشكل صحيح وعلى خادم واجهة برمجة تطبيقات ASP.NET.
يبدو الأمر مشابهًا للمشكلة التي واجهتها سابقًا. آمل أن تتمكن من توضيح كيفية حلها.