إدخال تسجيل الدخول باستخدام نظام ترخيص Apple

مرحبا يا هبر!

في هذا الصيف ، في مؤتمر WWDC 2019 ، قدمت Apple نظام تسجيل الدخول الخاص بها باستخدام نظام ترخيص Apple وجعله إلزاميًا لجميع التطبيقات في App Store التي تستخدم تسجيل الدخول إلى الوسائط الاجتماعية. الاستثناء هو التطبيقات التعليمية والتجارية والحكومية والتجارية التي تستخدم التفويض الخاص بها. بالنسبة لتسجيل الدخول باستخدام Apple ، قدمت Apple وثائق عالية الجودة ، وفي هذه المقالة سنستخدم مثال CIAN لوصف كيفية تنفيذه في خدمتنا.



تكوين حساب Apple Developer


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

الآن نقوم بتكوين معرف الخدمة - معرف فريد لتطبيق الويب الذي ستحتاج إليه للوصول إلى تسجيل الدخول باستخدام Apple API. في المجموع ، يمكن إنشاء ما يصل إلى 5 معرّفات للخدمة في معرّف التطبيق. للقيام بذلك ، انقر فوق الزر لإنشاء معرفات ، وحدد معرف الخدمة ، وقم بملء الحقول المطلوبة وانقر فوق تحرير في حقل تسجيل الدخول باستخدام Apple. سيتم فتح نموذج يتم فيه تحديد معرف التطبيق الأساسي الصحيح وتحديد نطاق الويب وسرد عناوين URL لإعادة التوجيه بعد تسجيل الدخول بنجاح. ضع في اعتبارك أنه يمكنك إدخال 10 عناوين URL للإرجاع فقط:



للحفظ ، انقر فوق حفظ ، متابعة وتسجيل. نعم ، لأي تغييرات في التكوين ، يجب النقر فوق الأزرار الثلاثة ، وإلا لن تصبح التغييرات نافذة المفعول.

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



هذا الملف مطلوب من Apple للتحقق من المورد الخاص بك. قم بتنزيله ووضعه على الموارد الخاصة بك. على الفور ، لم يكن هذا خداعًا مفيدًا بالنسبة لنا: عندما أضاف مشرفونا الملف ، فإن إعادة التوجيه (302) إلى الملف الذي يوجد في مكان آخر تعمل على عنوان url المحدد ، ولم تتحقق منه شركة Apple. ثم اضطررت إلى وضع الملف للوصول المباشر عن طريق URL (200). بعد قيام Apple بالتحقق من الملف بنجاح ، تضيء علامة اختيار خضراء بجوار المجال:



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



في الشاشة التالية ، تأكد من تنزيل الملف باستخدام المفتاح وحفظه في مكان آمن ، لأنه بعد مغادرة هذه الشاشة ، لن يكون المفتاح متاحًا للتنزيل. في نفس الصفحة ، يمكنك رؤية معرف المفتاح ، والذي ما زلنا بحاجة إليه:



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



أضف زر تسجيل الدخول باستخدام Apple إلى تطبيق iOS.


تعمل CIAN على ثلاث منصات: iOS و Android و Web. يوجد SDK أصلي لنظام التشغيل iOS ، لذلك سيبدو التفويض كالتالي:



لإضافة تسجيل الدخول باستخدام Apple إلى تطبيق iOS ، أضف زر ASAuthorizationAppleIDButton وقم بتعليق معالج النقر فوقه:

let appleIDProvider = ASAuthorizationAppleIDProvider() let request = appleIDProvider.createRequest() request.requestedScopes = [.fullName, .email] let authorizationController = ASAuthorizationController(authorizationRequests: [request]) authorizationController.delegate = self authorizationController.presentationContextProvider = self authorizationController.performRequests() 

بالإضافة إلى ASAuthorizationAppleIDProvider ، انتبه إلى ASAuthorizationPasswordProvider ، والذي يتيح لك الحصول على مجموعة من "تسجيل الدخول - كلمة المرور" من Keychain.

الآن ننفذ ASAuthorizationControllerPresentationContextProviding:

 func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {    return self.view.window! } 

إنشاء مفوض ASAuthorizationControllerDelegate يقوم بالإبلاغ عن النجاح أو الخطأ:

 public func authorizationController( controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization ) { guard let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential, let code = appleIDCredential.authorizationCode, let codeStr = String(data: code, encoding: .utf8) else {        // -            //           return } let email = appleIDCredential.email let firstName = appleIDCredential.fullName?.givenName let lastName = appleIDCredential.fullName?.familyName //           codeStr } public func authorizationController( controller: ASAuthorizationController, didCompleteWithError error: Error ) { //   } 

نرسل التخويل المستلم إلى الخادم وننتظر ردا من الواجهة الخلفية حول نجاح التفويض في نظامنا.

نحن نطبق تسجيل الدخول باستخدام Apple for web و Android


فجأة ، بالنسبة لنظامي Android و Web ، لا توفر Apple SDK ، لذلك في كلتا الحالتين تحتاج إلى فتح صفحة ترخيص Apple وستكون العملية مختلفة:



عنوان URL لصفحة تسجيل الدخول كالتالي:

 https://appleid.apple.com/auth/authorize?\ state=abvgd&\ response_type=code&\ client_id=ServiceID&\ scope=email+name&\ response_mode=form_post&\ redirect_uri=https%3A%2F%2Fcian.ru%2Fauth%2Fsome-callback%2F%3Ftype%3Dappleid 

النظر في معالمها:

  • client_id - معرف الخدمة الذي تم تسجيله أعلاه.
  • redirect_uri - URI حيث تتم إعادة توجيه المستخدم بعد المصادقة الناجحة من خلال AppleID. حددنا URI أعلاه عند إعداد Apple Developer.
  • الحالة - معرف جلسة المستخدم الذي ستعود إليه Apple عندما يتم استدعاء redirect_uri حتى نتمكن من التحقق من المرسل. يمكنك اختراع قاعدة لإنشاء هذه المعلمة بنفسك ، على سبيل المثال ، سلسلة عشوائية.
  • النطاق - تشير هذه المعلمة إلى المعلومات المطلوبة من المستخدم. على سبيل المثال ، الاسم أو البريد الإلكتروني أو كليهما ، كما في المثال أعلاه.
  • response_type - تشير هذه المعلمة إلى الشكل المطلوب للاستجابة. يمكن أن يكون رمز أو id_token. إذا قمت بتحديد id_token ، فأنت بحاجة إلى تحديده باستخدام المعلمة response_mode ، حيث يمكنك تحديد الاستعلام والجزء و form_post.

بعد المصادقة الناجحة ثنائية العامل عبر appleID ، ستقوم Apple باستدعاء redirect_uri المحدد وتمرير معلمات الحالة والرمز:

 curl -X POST \ 'https://www.cian.ru/some-callback/?type=appleid' \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data ' \ state=abvgd&\ code=12345&\ user={"name":{"firstName":"Tanya","lastName":"Sviridova"},"email":"someemail@gmail.com"}' 

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

استرجاع البيانات


على جميع العملاء ، لحفظ بيانات المستخدم ، يجب أن تحصل على access_token من Apple. للقيام بذلك ، اطلب أولاً Authorization_code:

 curl -X POST https://appleid.apple.com/auth/token -d '\ client_id=some_client_id&\ code=12345&\ client_secret=jwt_part1.jwt_part2.jwt_part3&\ grant_type=authorization_code' 

في هذا الطلب:

  • يشير client_id إلى ServiceID الذي تم إنشاؤه لتطبيق الويب و معرف التطبيق لتطبيق iOS.
  • رمز - تلقينا أعلى بعد إعادة التوجيه أو نقلها من عميل iOS
  • في المعلمة grant_type ، نقطع الغرض من الحصول على الرمز المميز: التخويل (Authorization_code) أو تجديد الرمز المميز (refresh_token)
  • في المعلمة client_secret - JSON Web Tokens استنادًا إلى المفتاح السري الذي تم الحصول عليه أثناء تسجيل التطبيق.

يمكنك إنشاء JSON Web Tokens في بيثون:

 claims = { 'iss': APPLEID_TEAM_ID, 'aud': 'https://appleid.apple.com', 'sub': client_id, 'iat': current_timestamp, 'exp': current_timestamp + expire_period, } headers = {'kid': 'APPLEID_KEY_ID', 'alg': 'ES256'} client_secret = jwt.encode(payload=claims, key=secret_key, algorithm='ES256', headers=headers).decode('utf-8') 

إذا سارت الأمور على ما يرام ، فستأتي المعلمات التالية في الاستجابة:
 {  "access_token":"ufhzch",  "token_type":"Bearer",  "expires_in":3600,  "refresh_token":"some_refresh_token",  "id_token":"some_long_signed_jwt_token" } 

الصيحة ، هنا هو access_token. جنبا إلى جنب مع ذلك يأتي refresh_token ، والتي يمكن تحديثها إذا لزم الأمر access_token.

يتم تخزين معلومات المستخدم في حقل id_token ، لكن يجب فك تشفيرها:
 public_key = jwt.algorithms.RSAAlgorithm.from_jwk(    json.dumps(apple_public_key) ) data = jwt.decode(    id_token,    public_key,    algorithm="RS256",    verify=True,    audience=client_id, ) 

Apple_public_key هو مفتاح عام يمكن الحصول عليه من الرابط.

بعد فك التشفير نحصل على:

 data = {  "iss": "https://appleid.apple.com",  "aud": client_id,  "exp": 1570379521,  "iat": 1570378921,  "sub": "  ",  "at_hash": "8ZDF6j786IQf9mA",  "email": "someemail@gmail.com",  "email_verified": "true",  "auth_time": 1570378804 } 

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

في هذه الإجابة ، نحتاج إلى المعلمات الفرعية ، التي يتم إرسالها في كل مرة ، والبريد الإلكتروني ، لذلك نحن حفظها في نظامنا وإبلاغ العميل حول التفويض الناجح. PROFIT.

النتائج الأولى


بعد إصدار الإصدار الجديد من CIAN with Sign in with Apple ، في اليوم الأول من اليوم ، استحوذت على ثلث التسجيلات الجديدة لنظام iOS 13 ، والآن تأخذ المركز الثاني لجميع إصدارات iOS ، في المرتبة الثانية بعد VK. هناك عدد قليل من التسجيلات على الموقع باستخدام AppleID ، ولكن عددهم ينمو ببطء. والآن لدينا خطط لتمكين التفويض عبر AppleID على تطبيقات Android ، ومعرفة عدد المستخدمين الذين سيسجلون بهذه الطريقة الصعبة.

Source: https://habr.com/ru/post/ar475062/


All Articles