تسجيل الدخول باستخدام Apple

@ديفيد، ردّ صاحب الـ PR على تعليقِي، ما رأيك في هذا؟:

أنا:

يبدو أن هذا الـ PR يحل مشكلة غياب الاسم والبريد الإلكتروني؟

صاحب الـ PR:

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

أليس الحصول على هذه المعلومات مرة واحدة عند المصادقة الأولية كافياً لنا؟

إنه أفضل من لا شيء، لكنه لا يزال غير مقبول. على سبيل المثال، إذا قمت بـ “تسجيل الدخول عبر Apple”، ثم قمت بالضغط على إلغاء في شاشة “إنشاء حساب”. أو إذا قمت بربط حساب موجود مع Apple، ثم قررت إنشاء حساب جديد بدلاً من ذلك. نأمل أن تحل Apple هذه المشكلة قبل نهاية النسخة التجريبية :crossed_fingers:

5 إعجابات

هل توجد حاليًا تطبيق عملي لميزة “تسجيل الدخول عبر Apple”؟ تخطط منصة أعمل عليها في مجال الأسواق الإلكترونية لإطلاق تطبيق iOS، لكن دون هذه الميزة، لا يمكننا تفعيل خيارات المصادقة الأخرى إلا إذا أردنا أن يُرفض تطبيقنا بسبب انتهاك إرشادات المتجر.

لا، ليس في علمي. نحن في انتظار حل هذه المشكلة https://github.com/nhosoya/omniauth-apple/issues/8، على الرغم من أن صاحب المستودع أغلقها بطريقة غير مفيدة.

لست متأكدًا تمامًا، لكن هل تجمعات مثل هذا والتجمعات الأخرى من أغسطس تحل المشكلة؟

لا تتردد في تثبيت الإضافة للتجربة، لكنني لا أعرف ما إذا كانت المشكلة قد حُلت بعد. ومع ذلك، لا أنصح باستخدامها في بيئة الإنتاج حتى يتم الانتهاء منها أو على الأقل الحصول على موافقة مطور لديه الوقت الكافي للتأكد من الأمور.

أنا مؤيد كبير لهذه الميزة. أود أن أرى دمجها في نظام Discourse الأساسي مثل خيارات تسجيل الدخول الأخرى.

أعتقد أنه لا يمكن استرداد هذا النوع من المعلومات عمدًا.

يعني عرض زر “تسجيل الدخول باستخدام Apple” في تطبيقك أو موقعك الإلكتروني أن المستخدمين يمكنهم تسجيل الدخول أو إنشاء حساب بضغطة واحدة باستخدام معرف Apple الذي يمتلكونه بالفعل، وتجاوز ملء النماذج والتحقق من عناوين البريد الإلكتروني واختيار كلمات المرور. يوفر “تسجيل الدخول باستخدام Apple” طريقة جديدة وأكثر خصوصية لتسجيل الدخول ببساطة وسرعة إلى التطبيقات والمواقع الإلكترونية، مع منح المستخدمين تجربة تسجيل دخول متسقة يمكنهم الوثوق بها، وراحة عدم الحاجة إلى تذكر حسابات وكلمات مرور متعددة. في الحالات التي تختار فيها طلب اسم وعنوان بريد إلكتروني، يكون لدى المستخدمين خيار الحفاظ على خصوصية عنوان بريدهم الإلكتروني ومشاركة عنوان بريد إلكتروني فريد وعشوائي بدلاً من ذلك.

شاهد المقال الكامل للمطورين من Apple

أنت محق، الخصوصية هي أحد الجوانب الرئيسية لتسجيل الدخول عبر Apple، لكن الجزء الأهم من اقتباسك هو:

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

لا أعتقد أن هذا شيء يمكن لمؤلف المكتبة إصلاحه — بل هو شيء يتطلب تغييرًا من Apple. ولا أرى حدوث ذلك في أي وقت قريب، لذا ربما نضطر فقط إلى طلب من المستخدمين إدخال اسمهم/بريدهم الإلكتروني في Discourse يدويًا :cry:

4 إعجابات

نعم، ولكن ماذا عن الأشخاص الذين يختارون في النهاية عدم تقديم معلوماتهم؟

أوه، وإليك مفهومًا أوليًا تقريبًا. :sweat_smile:

أخبار جيدة:

نجحت جزئيًا في تشغيل نسخة مشتقة (fork) من إضافة Robert/merefield (تتضمن النسخة المشتقة فقط التبديل إلى نسخة من مكتبة omniauth gem قمت ببنائها من أحدث مصدر على GitHub). ومع ذلك، في موقع Discourse الاختباري الخاص بي (الذي يستخدم HTTPS من طرف إلى طرف عبر ngrok)، اضطررت إلى تعيين إعداد الموقع نفسه “ملفات تعريف الارتباط للموقع” إلى (لا شيء) لكي تعمل المصادقة. مع تعطيل هذا الإعداد، يمكنني إنشاء حساب (حتى لو أغلقت نموذج التسجيل) ويمكنني تسجيل الدخول مرة أخرى، لكنني غير قادر على القيام بذلك إذا كان الإعداد مفعلًا.

تتبع المكدس (backtrace) من محاولة تسجيل دخول فاشلة موضح أدناه:

تتبع المكدس لمحاولة تسجيل دخول فاشلة
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.5.1/lib/logster/logger.rb:112:in `report_to_store'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.5.1/lib/logster/logger.rb:103:in `add_with_opts'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.5.1/lib/logster/logger.rb:54:in `add'
/usr/local/lib/ruby/2.6.0/logger.rb:543:in `error'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:163:in `log'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:486:in `fail!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-oauth2-1.6.0/lib/omniauth/strategies/oauth2.rb:71:in `callback_phase'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:238:in `callback_call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:189:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/omniauth-1.9.0/lib/omniauth/builder.rb:64:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:47:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/conditional_get.rb:38:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:318:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/session/abstract/id.rb:259:in `context'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/session/abstract/id.rb:253:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/cookies.rb:648:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:101:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.5.1/lib/logster/middleware/reporter.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/method_override.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/executor.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/sendfile.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/host_authorization.rb:77:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.4/lib/mini_profiler/profiler.rb:184:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.3/lib/message_bus/rack/middleware.rb:57:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:181:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/urlmap.rb:68:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/urlmap.rb:53:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.8/lib/rack/urlmap.rb:53:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.2/lib/unicorn/http_server.rb:605:in `process_client'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.2/lib/unicorn/http_server.rb:700:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.2/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.2/lib/unicorn/http_server.rb:144:in `start'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.2/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

هل لدى أي شخص هنا أي اقتراحات حول ما إذا كان بإمكاني أو كيف يمكنني إعادة كتابة الإضافة بحيث لا تتطلب بعد الآن تعطيل إعداد الموقع هذا لكي تعمل وظائفها الأساسية؟ يعيش كود الإضافة الخاص بي في https://github.com/sau226dev/discourse-sign-in-with-apple، ويجب أن يكون أحدث كود استخدمته لإعادة بناء مكتبة omniauth gem موجودًا في نفس المنظمة على GitHub.

شكرًا على أي مساعدة يمكنكم تقديمها مقدمًا،

sau226

4 إعجابات

كانت الإضافة تعمل إلى حد ما في الأصل، لكنها لم تحظَ بالاهتمام مؤخرًا بسبب المشكلة التي ذكرها ديفيد أعلاه.

حتى نتلقى أخبارًا إيجابية مفادها أن شركة أبل قد حلت هذا العائق الجوهري (إرسال الاسم والبريد الإلكتروني في كل محاولة تسجيل دخول)، فإن صيانة هذا الكود لا تستحق الجهد، في رأيي. ولا أعتقد أن هناك أي إجراء يمكنك اتخاذه لتجاوز هذه المشكلة؟ وهذا هو السبب في أنني لم أحاول حتى تحديث التبعيات. فحتى في هذه الحالة، ستفشل الإضافة في الاختبارات.

لذلك، هذه الإضافة ليست “مُصدرة” (وإلا لكان هذا الموضوع أو موضوع مشابه موجودًا في قناة #plugin)، ومن غير المرجح أن تحظى بأي دعم حتى يحدث ذلك. سأكون سعيدًا جدًا “بتلميعها” إذا تم حل هذه المشكلة ووفرت شركة أبل هذه المعلومات.

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

6 إعجابات

أعتقد أن @sau226 يبدو أنه يشير إلى أن عدم وجود بريد إلكتروني/اسم مُرجع ليس في الواقع عائقًا؟

@orenwolf لم يكن الأمر (غياب البريد الإلكتروني/الاسم عند تسجيل الدخول اللاحق) يبدو مشكلة. أعتقد أنني تمكنت من إغلاق نافذة التسجيل واستئناف العملية مع إدخال التفاصيل الصحيحة. وكما ذكرت من قبل، تمكنت من تسجيل الدخول عبر Apple مباشرة بعد ذلك دون أي مشكلة.

المشكلة الوحيدة التي واجهتها كانت خطأ CSRF ما لم يتم تعطيل إعداد الموقع الذي ذكرته أعلاه. ومن المشكلات المحتملة الأخرى غياب حقل الاسم في نموذج تسجيل الدخول، وأن اسم المستخدم هو ما يسبق علامة @ في البريد الإلكتروني (ومع ذلك، إذا سألتموني، فإن هذه المشكلات المحتملة إما أنها ليست مشكلة على الإطلاق، أو يمكن للمستخدم حلها بسهولة).

4 إعجابات

بالإضافة إلى تعليقات ديفيد أعلاه، وجدت موضوعًا ذا صلة على موقع دعم المطورين الخاص بشركة آبل، تلقى ردًا رسميًا يؤكد المشكلة:

الرد الرسمي:

مرحبًا aslkdjalksdjasdasd،
هذا السلوك صحيح؛ حيث تُرسَل معلومات المستخدم فقط في كائن ASAuthorizationAppleIDCredential عند تسجيل المستخدم لأول مرة. أما تسجيلات الدخول اللاحقة إلى تطبيقك باستخدام ميزة “تسجيل الدخول عبر آبل” باستخدام نفس الحساب، فلا تتضمن أي معلومات للمستخدم، بل ستُرجع فقط معرف المستخدم في كائن ASAuthorizationAppleIDCredential. يُوصى بحفظ كائن ASAuthorizationAppleIDCredential الأول الذي يحتوي على معلومات المستخدم بشكل آمن في ذاكرة التخزين المؤقت حتى يتم التحقق من إنشاء الحساب بنجاح على خادمك.
باتريك

كما يعلق أحد المطورين:

إذن انتظر… إذا ضاع为重 توجيه أول من آبل لأي سبب من الأسباب العديدة الشائعة جدًا، فقد نفقد هذا المستخدم بشكل دائم لأنه لا توجد طريقة أخرى للحصول على معلوماته. هل لا توجد طريقة أخرى للحصول على هذه المعلومات؟

وآخر يقول:

أو إذا حدث خطأ ما لاحقًا في السلسلة، فسيتعرض العملاء للشكاوى، وسيخبرهم الدعم بالدخول إلى موقع Apple ID لسحب الإذن، حتى يتمكنوا من التسجيل مرة أخرى بشكل صحيح. أعتقد أن هذا سيكون تجربة سيئة، وسيجعل الناس يتجنبون استخدام هذه الآلية لتسجيل الدخول إذا بدأوا في مواجهة مثل هذه المشاكل.

لذلك لا أعتقد أنه يمكن استخدام هذه الآلية بأمان في بيئة الإنتاج، للأسف. سيكون هذا كابوسًا للدعم.

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

11 إعجابًا

هذا أمر محبط. :cry:

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

قامت شركة آبل بتحديث صفحة مطوري “تسجيل الدخول باستخدام Apple” لتشمل مزيدًا من المعلومات حول جمع البيانات وإدارتها وما إلى ذلك.

5 إعجابات

لقد فتحت طلب سحب لتحديث مكتبة omniauth-apple إلى أحدث إصدار، والذي يتضمن هذا الالتزام ويبدو أنه قد يحل مشكلة عدم استلام بريد المستخدم الإلكتروني في كل تسجيل دخول.

وللتجربة، اتبعت مقال المدونة الموصى به لإعداد بيانات الاعتماد، لكنني لم أستطع حتى الآن فهم أمرين:

  • ما هو مسار إعادة توجيه عنوان URL المطلوب لإعداد معرف الخدمة مع Apple؟
  • كيف أحصل على “ملف التحقق النصي”، أم أنه غير مطلوب؟ عند البحث، وجدت إشارات إلى أنه يمكن تنزيله من Apple كجزء من إعداد التواصل عبر النطاق/البريد الإلكتروني، لكن يبدو أن هذا لم يعد ساريًا:
3 إعجابات

شكرًا لك.

عادةً ما يتم تقديم طلب سحب (PR) بعد اختبار شيء ما بنجاح :wink:

يرجى التأكيد عند الانتهاء.

يبدو الأمر بديهيًا، لكنني سأكون أكثر تشجيعًا إذا كانت لدينا بيان من أبل يؤكد أنهم يرسلون بريدًا إلكترونيًا في كل مرة. لن يؤدي تغيير إصدار المكتبة (gem) إلى حل المشكلة إذا لم تعالج أبل القضية الأساسية.

سأراجع إعداداتي عندما أجدد اشتراكي في برنامج مطوري أبل، وهو ما لم أفعله بعد … (كان هذا الإخفاق مُثبطًا بعض الشيء، بصراحة)

@David

لقد جربت ترقية نسخة التفرع الخاصة بنا من الإضافة لاستخدام أحدث إصدار من omniauth-apple. (لاحظ أن هناك بعض التغييرات الأخرى المطلوبة، وليس مجرد ترقية رقم الإصدار).

tl;dr: لا يزال الأمر معطلاً

تمكنت من تعديل الكود ليصبح يعمل في بيئة الاختبار الخاصة بي، لكنه لا يزال يعاني من عدة مشكلات:

  1. تستخدم Apple طلب POST في عملية الاستدعاء (callback). وهذا غير شائع في تطبيقات OAuth لأنه يعني أن ملفات تعريف الارتباط ذات samesite=Lax لن تُرسل مع الطلب. وهذا يعني أن Discourse لا يمكنه قراءة ملفات تعريف الارتباط للجلسة أثناء الاستدعاء، وبالتالي يُرجع خطأ CSRF.

    حل غير آمن هو تعطيل هذا الإجراء الأمني عن طريق تغيير ملفات تعريف الارتباط في Discourse إلى samesite=None.

  2. استخدام طلب POST بدون رمز CSRF يُفعّل أيضًا إجراءً أمنيًا آخر في النواة (core).

    حل غير آمن هو إزالة هذا السطر.

  3. كنت أحصل على استجابة 403 من Apple عندما يقوم مكتبة omniauth بجلب مفاتيح JWKs. أشك في أن رأس Accept: لا يتم تعيينه بشكل صحيح، لكنني لم أتحقق من ذلك بعد.

    كان الحل غير الآمن هو ترميز المفاتيح بشكل ثابت.

بعد كل ذلك، تمكنت أخيرًا من تسجيل الدخول باستخدام Apple. يمكنك تجربتها على https://sandbox.dtaylor.uk (سأبقيها تعمل لبضعة أيام، لكن يرجى عدم إدخال أي معلومات حساسة هناك لأنها غير آمنة).

ثم… لا تزال عناوين البريد الإلكتروني والأسماء مدرجة فقط في عملية المصادقة الأولى. يمكنك تجربة ذلك: سجل الدخول باستخدام Apple، ألغِ إنشاء الحساب، ثم حاول مرة أخرى. ستفقد التفاصيل في المحاولة الثانية.

لذا، بافتراض أن Apple لن تغير الأمور قريبًا… كيف يمكننا جعل هذا يعمل؟

بالنسبة للنقطتين (1) و(2)، أعتقد أننا يمكننا تحويل طلب POST من Apple إلى GET دون الإضرار بالأمان. عندما نستقبل طلب POST في الاستدعاء، نقوم بتحميل بعض JavaScript الذي يضبط window.location='/auth/apple/callback?code=...&state=...'. من هناك، سيعمل الأمر تمامًا مثل أي مزود آخر. ومع ذلك، أعتقد أن اعتراض طلب POST يتطلب بعض التغييرات في واجهة برمجة التطبيقات الأساسية (core API).

أما بالنسبة للنقطة (3)، فأعتقد أنه يمكن إصلاحها على الأرجح بجهد بسيط في مكتبة omniauth.

لكننا لا زلنا عالقين بدون أسماء أو عناوين بريد إلكتروني، لذا لست متأكدًا مما إذا كان يستحق إصلاح هذه المشكلات الأخرى :cry:

8 إعجابات

شكرًا لك على المحاولة مرة أخرى وعلى تحليلك! ربما قد يساعد تقديم حالة دعم فني إلى شركة آبل في توضيح المشكلات المتبقية؟ فمن خبرتي، من المرجح أن يقدموا حلولًا أو بدائل ممكنة هناك أكثر مما يفعلون في منتديات مطوري آبل.