لقد جربت ترقية نسخة التفرع الخاصة بنا من الإضافة لاستخدام أحدث إصدار من omniauth-apple. (لاحظ أن هناك بعض التغييرات الأخرى المطلوبة، وليس مجرد ترقية رقم الإصدار).
tl;dr: لا يزال الأمر معطلاً
تمكنت من تعديل الكود ليصبح يعمل في بيئة الاختبار الخاصة بي، لكنه لا يزال يعاني من عدة مشكلات:
-
تستخدم Apple طلب POST في عملية الاستدعاء (callback). وهذا غير شائع في تطبيقات OAuth لأنه يعني أن ملفات تعريف الارتباط ذات
samesite=Laxلن تُرسل مع الطلب. وهذا يعني أن Discourse لا يمكنه قراءة ملفات تعريف الارتباط للجلسة أثناء الاستدعاء، وبالتالي يُرجع خطأ CSRF.حل غير آمن هو تعطيل هذا الإجراء الأمني عن طريق تغيير ملفات تعريف الارتباط في Discourse إلى
samesite=None. -
استخدام طلب POST بدون رمز CSRF يُفعّل أيضًا إجراءً أمنيًا آخر في النواة (core).
حل غير آمن هو إزالة هذا السطر.
-
كنت أحصل على استجابة 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.
لكننا لا زلنا عالقين بدون أسماء أو عناوين بريد إلكتروني، لذا لست متأكدًا مما إذا كان يستحق إصلاح هذه المشكلات الأخرى ![]()