تنفيذ تسجيل الدخول إلى discourse باستخدام Apple API

مرحباً، أنا أعمل على بناء واجهة برمجة تطبيقات (API) لتسجيل الدخول إلى Discourse باستخدام Apple. لقد قمت بالفعل بتثبيت المكون الإضافي واتبعت التعليمات من Discourse Apple Authentication. إنه يعمل بشكل جيد عند تسجيل الدخول إلى Discourse باستخدام حساب Apple على الموقع الإلكتروني.

بعد التحقق من تدفق تسجيل الدخول عبر Apple من الويب، لاحظت أنه يعيد التوجيه إلى صفحة Apple لتسجيل الدخول، ويحصل على رمز تم إنشاؤه من Apple عند تسجيل الدخول بنجاح، ثم يعيد التوجيه إلى:

POST {{discourse_host}}/auth/apple/callback مع المعلمات state:{state}, code:{code from Apple}

بعد ذلك، يعيد التوجيه إلى GET {{discourse_host}}/auth/apple/callback?code={{code from Apple}}&state={state}، مما يؤدي إلى إنشاء ملف تعريف ارتباط جديد سيتم استخدامه في واجهة برمجة تطبيقات Discourse.

من هذا التدفق، أتوقع أنه سيتم إنشاء ملف تعريف ارتباط جديد بعد استدعاء /auth/apple/callback

ولكن عندما أحاول استدعاء واجهة برمجة التطبيقات، تظهر لي رسالة الخطأ Authorization timed out, or you have switched browsers. Please try again.

لذلك حاولت مرة أخرى برمز جديد تم إنشاؤه بواسطة Apple ولكنني ما زلت أحصل على نفس الخطأ.

وعندما أتحقق من السجل، يظهر:

Started GET "/auth/apple/callback?code=c32f105b5084d42b8bd3e7051873ddb55.0.rrzxz.pChPU9zGlXIHHhgEXLiA5g&state=fbi3bbboud" for
(apple) Setup endpoint detected, running now.
(apple) Callback phase initiated.
(apple) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
Started GET "/auth/failure?message=csrf_detected&strategy=apple" for 123.253.233.16 at 2023-11-27 06:10:28 +0000
Processing by Users::OmniauthCallbacksController#failure as HTML
  Parameters: {"message"=>"csrf_detected", "strategy"=>"apple"}
  Rendered users/omniauth_callbacks/failure.html.erb within layouts/no_ember (Duration: 4.1ms | Allocations: 17)
  Rendered layout layouts/no_ember.html.erb (Duration: 57.5ms | Allocations: 2882)

Message (47 copies reported)

(apple) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

Backtrace

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:163:in `log'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:486:in `fail!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-oauth2-1.7.3/lib/omniauth/strategies/oauth2.rb:87:in `callback_phase'
/var/www/discourse/plugins/discourse-apple-auth/lib/omniauth_apple.rb:60:in `callback_phase'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:238:in `callback_call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:189:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:192:in `call!'

لذلك، أريد أن أسأل ما إذا كان هذا الاتجاه لاستخدام تسجيل الدخول عبر Apple في Discourse باستخدام واجهة برمجة التطبيقات صحيحًا، وكيف يمكنني حل مشكلة خطأ csrf_detected؟

لم يتم تصميم المصادقة من Apple (وجميع طرق المصادقة الأخرى في Discourse في الواقع) لاستخدامها عبر واجهة برمجة التطبيقات (API). يجب استخدامها مباشرة من قبل المستخدمين النهائيين في متصفح مدعوم.

ما المشكلة التي تحاول حلها هنا؟ ربما يمكننا إيجاد حل بديل؟

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

مرحباً @david، شكراً لردك. ما أريد تحقيقه هنا هو إنشاء واجهة برمجة تطبيقات لتسجيل الدخول عبر Apple سيتم استخدامها بواسطة تطبيق الهاتف المحمول للوصول إلى واجهة برمجة تطبيقات Discourse.

لاستخدام واجهة برمجة تطبيقات Discourse لتسجيل الدخول باستخدام البريد الإلكتروني وكلمة المرور، تعمل بشكل جيد باستخدام واجهات برمجة تطبيقات Discourse هاتين:

  1. {{discourse_host}}/session/csrf.json: تُرجع واجهة برمجة التطبيقات هذه ملف تعريف ارتباط ورمز CSRF، والذي سيتم استخدامه لتسجيل الدخول باستخدام واجهة برمجة التطبيقات التالية.
  2. {{discourse_host}}/session: تُرجع واجهة برمجة التطبيقات هذه ملف تعريف ارتباط جديد يمكن استخدامه للوصول إلى واجهات برمجة تطبيقات Discourse الأخرى.
واجهة برمجة تطبيقات Csrf

الجلسة

أتوقع أن يكون الأمر مشابهاً لتسجيل الدخول عبر Apple في Discourse، حيث أقوم بإنشاء طلب إلى واجهة برمجة تطبيقات Discourse لإنشاء ملف تعريف الارتباط _t.

مرحباً @david، هل لديك حل لمشكلتي؟

لا يوجد إجابة سهلة للأسف. تم تصميم واجهات برمجة تطبيقات المصادقة مثل هذه خصيصًا لتجنب تشغيلها دون تفاعل حقيقي من المستخدم على الويب.

بالنسبة لحالة الاستخدام الخاصة بك، سيكون الحل الأكثر شيوعًا هو استخدام نظام مفاتيح واجهة برمجة تطبيقات المستخدم. سيتيح ذلك لـ Discourse التعامل مع 100٪ من منطق المصادقة، وسيعطي تطبيقك بعض مفاتيح واجهة برمجة التطبيقات لكل مستخدم. يجب أن تكون هذه الاستراتيجية أكثر قوة من محاولة “تزييف” جلسة مستخدم.

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