إعادة التوجيه إلى موقع خارجي في إضافة؟

أحاول استدعاء عنوان 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، أو شيء من هذا القبيل؟

بالتأكيد، هناك شيء بسيط أغفله. آخر محاولة لي هي:

      url = thinkific_sso_url(payload)
      redirect_location = "<!DOCTYPE html><html><head><meta http-equiv=\"Refresh\" content = \"5; url='#{url}'\" /></head><body>هذا هو جسمي</body></html>"
      Rails.logger.info "يتم إعادة التوجيه... #{redirect_location}"

      render plain: redirect_location

إذا حفظت النص الموجود في redirect_location في ملف وفتحه في متصفحي، فسأتم تسجيل الدخول إلى Thinkific وسيتم إعادة توجيهي إلى Discourse. للأسف، لا يعمل نفس الشيء عند النقر على تسجيل الدخول في متصفحي.

هل يمكن لأي شخص أن يمدني بمساعدة؟

أعتذر لأنني أستدعيك يا @sam، لكنني أشعر بأن هناك شيئًا خاصًا بمنصة Discourse وسريعًا يمكنك مساعدتي فيه، بينما أعمل على هذا الأمر منذ أسبوعين.

نجح شغلي البرمجي من خلال إضافة وسيط في المنتصف، لكن هذا لا يبدو حلًا جيدًا.

عندما أحاول استخدام redirect_to لإعادة التوجيه إلى موقع خارجي في SessionController الذي أقوم بتعديله، أواجه خطأ CORS. يبدو أن الكود نفسه من Thinkific لا يواجه هذه المشكلة. هل هناك شيء خاص بإجراء إعادة التوجيه من داخل site_url/session؟ هل عليّ تنفيذ إعادة التوجيه عبر JavaScript بطريقة ما؟ إذا كان الأمر كذلك، هل يمكنك توجيهي بشكل عام حول كيفية عمل ذلك؟

بصدق، لست متأكدًا مما يحدث هنا. يجب أن يعمل redirect_to مع عنوان URL خارجي.

أوه، يا إلهي.

إنه يعيد التوجيه بالفعل، لكنه يولد انتهاكًا لسياسة CORS. الأمر غريب لأن إعادة التوجيه التي تبدو مطابقة تمامًا لا تسبب انتهاكًا لسياسة CORS في كود Rails النموذجي الخاص بهم. كنت أأمل أن يكون هناك شيء خاص في القيام بذلك داخل Ember، أو شيء من هذا القبيل.

إذن، انتهت آمالي في أن يكون الأمر شيئًا تافهًا وواضحًا.

شكرًا جزيلاً لك. أقدر ذلك حقًا.

أنا متأكد إلى حد كبير أنه نظرًا لأن نافذة تسجيل الدخول تتم عبر AJAX (في base_url/session)، فإن المتصفح يرفض إجراء redirect_to ما لم يرسل الطرف الآخر رؤوس CORS.

ما أعتقد أنني أحتاجه هو طريقة ما (ولا أعرف كيف أصف ذلك) للخروج من AJAX بحيث يبدو للمتصفح وكأنه إعادة توجيه عادية، وليس إعادة توجيه داخل AJAX.

أو، هل هناك طريقة ما لجعل صفحة تسجيل الدخول غير معتمدة على AJAX؟

مرحبًا @pfaffman

هل نجحت في حل هذه المشكلة؟ أواجه نفس المشكلة عند استخدام تسجيل الدخول عبر SSS الخاص بـ Discourse من واجهة برمجة تطبيقات ASP.NET Core.

تقوم متصفح تطبيق Angular بإرجاع خطأ “رأس التحكم في القبول” غير موجود بمجرد إعادة توجيه الطلب من واجهة البرمجة إلى تطبيق Angular (بعد أن يرسل Discourse الرد بنجاح).

تطبيق Angular → واجهة برمجة تطبيقات ASP.NET → استدعاءات واجهة البرمجة لـ Discourse SSO → يعيد Discourse القيم إلى خادم واجهة برمجة تطبيقات ASP.NET → يعيد خادم واجهة البرمجة توجيه الاتصال مرة أخرى إلى عنوان URL لتطبيق Angular → يقوم المتصفح بإرجاع خطأ بأن عنوان URL الخاص بـ Discourse غير متاح بسبب عدم وجود “رأس التحكم في الوصول إلى المصدر”.

image

تمت إعداد جميع إعدادات CORS على Discourse بشكل صحيح وعلى خادم واجهة برمجة تطبيقات ASP.NET.

يبدو الأمر مشابهًا للمشكلة التي واجهتها سابقًا. آمل أن تتمكن من توضيح كيفية حلها.