استخدام AuthSub في ActionScript

يوضح هذا المستند كيفية استخدام نظام مصادقة AuthSub من Google من تطبيق Flash أو Silverlight.

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

تتيح واجهة AuthSub في ActionScript لتطبيقات Flash أو Silverlight المصادقة على خلاصات Google Data API المحمية نيابةً عن المستخدم. للحفاظ على مستوى عالٍ من الأمان، تمكن الواجهة التطبيق من الحصول على رمز مصادقة مميز بدون معالجة معلومات تسجيل الدخول لحساب المستخدم.

AuthSub for ActionScript هي إحدى صيغ AuthSub للغة JavaScript. ومثل AuthSub لجافا سكريبت، فإنه يقدم طريقة عبر النطاقات لتطبيقات العميل للمصادقة من صفحة ويب مستضافة على نطاق بخلاف Google. ويختلف هذا الملف عن الإصدار العادي من AuthSub في أنّ خدمة المصادقة متوفّرة على نطاق مختلف (accounts.googleapis.com بدلاً من www.google.com) وتوفّر ملف crossdomain.xml يسمح بالوصول إلى هذا النطاق من المواقع الإلكترونية الخارجية.

اطلع أيضًا على مجموعة واجهة برمجة تطبيقات حسابات Google للمناقشة حول استخدام جميع واجهات برمجة تطبيقات خدمة المصادقة.

الجمهور

هذا المستند موجّه للمبرمجين الذين يطورون تطبيقات الويب Flash أو Silverlight التي يمكنها الدخول إلى خدمات Google.

يفترض هذا المستند أنك تفهم الأفكار العامة وراء بروتوكول Google Data APIs وواجهة AuthSub. كما يفترض أنك تعرف كيفية البرمجة في ActionScript.

البيئات المتوافقة

AuthSub for ActionScript معتمد حاليًا في Firefox 1.5 والإصدارات الأحدث وInternet Explorer 6.0 والإصدارات الأحدث، مع Flash 9.0 أو أحدث أو Silverlight 2.0 أو أحدث.

آلية عمل AuthSub في ActionScript

في ما يلي ملخص سريع لكيفية عمل الاتصال بين تطبيق ويب وخدمة مصادقة Google وخدمة بيانات Google:

  1. للدخول إلى خدمة بيانات Google نيابة عن المستخدم، يجب أن يحتوي تطبيق الويب على رمز مصادقة صالح. عادةً ما تخزّن التطبيقات هذا الرمز المميز في ملف تعريف ارتباط، وإذا لم يتوفر ملف تعريف الارتباط هذا، يجب أن يحصل تطبيق الويب على الرمز المميز عبر AuthSub. للحصول على رمز مميز، يُجري تطبيق الويب استدعاء تسجيل دخول AuthSub for ActionScript إلى خدمة المصادقة، مع تحديد الخدمة التي سيتم الوصول إليها.
  2. وعند استلام الطلب من تطبيق الويب، تعيد خدمة المصادقة توجيه المستخدم إلى صفحة "طلب الدخول". تطلب هذه الصفحة من المستخدم تسجيل الدخول إلى حسابه على Google وتطلب منه منح أو رفض الوصول إلى خدمة Google.
  3. يقرر المستخدم ما إذا كان يريد منح أو رفض الدخول إلى تطبيق الويب. إذا رفض المستخدم الدخول، فسيتم توجيهه إلى صفحة Google بدلاً من الرجوع إلى تطبيق الويب.
  4. إذا نجح المستخدم في تسجيل الدخول ومنح إمكانية الدخول، فإن خدمة المصادقة تعيد توجيه المستخدم إلى عنوان URL لتطبيق الويب الذي أجرى الاستدعاء الأصلي. تؤدي إعادة التوجيه إلى تسليم رمز مصادقة مميز للخدمة المحددة عبر معلمة طلب البحث. ويجب أن يخزن التطبيق الرمز المميز كملف تعريف ارتباط في متصفح المستخدم، ضمن نطاق تطبيق الويب. الرمز المميز صالح حتى يتم إبطاله. (راجع قسم حول الرموز المميزة للحصول على نصائح حول وقت إبطال الرموز المميزة).
  5. يتصل تطبيق الويب بخدمة بيانات Google ويرسل الرمز المميز للمصادقة مع كل طلب يتم إرساله إلى الخدمة.
  6. إذا تعرفت خدمة بيانات Google على الرمز المميز، فإنها توفر البيانات المطلوبة.

استخدام واجهة AuthSub في ActionScript

توفر AuthSub في ActionScript أو AuthSubAS نقطة نهاية AuthSub على مستوى النطاقات لتطبيقات Flash (أو Silverlight) التي تستخدم Google Data APIs.

توفر AuthSubAS نسخة مطابقة من نقاط نهاية AuthSub الموجودة على google.com، مع ملف crossdomain.xml إضافي يسمح لبرنامج Flash (أو Silverlight) بالوصول إلى نقاط النهاية هذه. على سبيل المثال، يمكن استخدام نقطة النهاية AuthSubSessionToken من خلال الوصول إلى https://accounts.googleapis.com/accounts/AuthSubSessionToken.

اتبع الخطوات التالية خلال عملية الحصول على رمز المصادقة المميز واستخدامه للدخول إلى إحدى خدمات Google من تطبيق فلاش.

  1. إعداد السياسات على مستوى النطاقات.

    لاستخدام Flash بطريقة عبر النطاقات، يجب تهيئته مع سياسة لكل نطاق خارجي يجب الوصول إليه. ولإجراء ذلك، عليك باستدعاء طريقة ActionScript Security.loadPolicyFile(policy) لكل نطاق، كما يلي:

    <?xml version="1.0" encoding="utf-8"?>
    <Application xmlns="http://www.adobe.com/2006/mxml"
      initialize="onInitialized()"
      applicationComplete="onLoaded()">
      <Script>
        import flash.external.ExternalInterface;
        import flash.net.navigateToURL;
        import mx.controls.Alert;
    
        private function onInitialized() : void {
          // Load the cross domain policy file for each of the googleapis.com
          // domains used. At the very least, we need the ones for the API (photos,
          // in this case) and the one for AuthSub for ActionScript (accounts).
          Security.loadPolicyFile('http://photos.googleapis.com/data/crossdomain.xml');
          Security.loadPolicyFile('https://accounts.googleapis.com/crossdomain.xml');
        }
    
    

    عرض النموذج الكامل

    تجدر الإشارة إلى أننا نحمّل هنا السياسة accounts.googleapis.com (AuthSubAS) وphotos.googleapis.com/data (للويب بيكاسا التي يصل إليها المثال لاحقًا).

  2. طلب رمز مميز يُستخدم لمرة واحدة

    الخطوة الأولى في عملية AuthSub هي طلب رمز مميز يُستخدم لمرة واحدة من نقطة نهاية AuthSub. ينبغي لتطبيقك إجراء ذلك من خلال استدعاء مكالمة إلى نقطة نهاية AuthSubRequest، كما يلي:

          var getTokenPage : URLRequest = new URLRequest('https://www.google.com/accounts/AuthSubRequest');
    
          // Construct the parameters of the AuthSub request. These are the same parameters
          // as normal AuthSub, which can be found here: /accounts/docs/AuthSub.html#AuthSubRequest
          var authSubParams : URLVariables = new URLVariables();
          authSubParams['scope'] = 'http://photos.googleapis.com/data'; // photos API
          authSubParams['session'] = 1; // single-use token
          authSubParams['secure'] = 0; // non-secure apps
          authSubParams['next'] = 'photos.swf'; // The URL of this app.
    
          getTokenPage.data =  authSubParams;
          navigateToURL(getTokenPage, '_top');
    
    

    عرض النموذج الكامل

    تتطلّب هذه الطريقة قيمة scope. تحدد كل خدمة من خدمات Google نطاق الوصول الذي تسمح به، ويجب الإشارة إلى هذا النطاق في طلب الرمز المميز. لتحديد قيمة النطاق المراد استخدامه، راجع الوثائق لخدمة Google التي تريد الدخول إليها. يبدو النطاق كعنوان URL، وقد يكون عنوان URL بسيطًا يحدِّد الخدمة أو قد يحدِّد إمكانية وصول أكثر تقييدًا، مثل تقييد الوصول إلى إذن القراءة فقط. عندما تقدّم الخدمة خيارًا للنطاقات، يمكنك طلب الرمز المميّز الأكثر تحديدًا. على سبيل المثال، للوصول إلى خلاصات بيانات "تقويم Google"، استخدِم النطاق 'http://www.google.com/calendar/feeds'، وليس 'http://www.google.com/calendar'.

    ملاحظات:

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

  3. طلب رمز مميز للمصادقة

    وستعرض نقطة نهاية AuthSubRequest رمزًا مميزًا يُستخدم لمرة واحدة لتطبيقك من خلال ضبط عنوان URL لمتصفّح المستخدم على http://yourWebAppUrl?token=singleUseToken. بعد أن يتلقّى تطبيقك الرمز المميز الذي يُستخدم لمرة واحدة، يجب أن يستبدل الرمز المميز بالرمز المميز للاستخدام المتعدد (تدوم طويلاً)، والذي يمكن استخدامه بعد ذلك لتقديم طلبات مقابل خلاصات بيانات Google. لإجراء ذلك، عليك استدعاء طريقة AuthSubSessionToken باستخدام الرمز المميّز للاستخدام الفردي.

    يجب أن يبحث تطبيقك عن المعلمة token في عنوان URL عند تحميله:

        private function onLoaded() : void {
    
          // Once the application has loaded, check to see if an AuthSub token was
    // placed into the current page's URL. If it was, the user has already
    // authenticated, and we can continue to connect to the the service itself. var searchPortion : String = ExternalInterface.call('window.location.search.toString'); if (searchPortion.length > 0) { // remove the ? from the token and extract the token. searchPortion = searchPortion.substring(1); // NOTE: Real applications should parse the URL properly. if (searchPortion.indexOf('token=') == 0) { getLongLivedToken(searchPortion.substring(6)); return; } // more code ... }

    عرض النموذج الكامل

    وإذا تم العثور على الرمز المميّز، يجب أن يستدعي طريقة مثل getLongLivedToken، التي تستدعي نقطة نهاية AuthSubSessionToken:

        private function getLongLivedToken(singleUseToken : String) : void {
          // Construct a call to the AuthSub for ActionScript endpoint on accounts.googleapis.com.
          // This call will exchange the single use token given to use by AuthSub for a long-term
          // token that we can use to make requests to endpoints such as Photos.
          var getTokenRequest : URLRequest = new URLRequest('https://accounts.googleapis.com/accounts/AuthSubSessionToken');
    
          // Due to a bug in Flash, a URLRequest with a GET request will
          // not properly send headers. We therefore use POST for this and *ALL*
          // requests.
          getTokenRequest.method = URLRequestMethod.POST;
    
          // Due to a bug in Flash, a URLRequest without a valid parameter will
          // not properly send headers. We therefore add a useless parameter to
          // make this code work.
          getTokenRequest.data = new URLVariables('pleaseignore=ignore');
    
          // Add the AuthSub for ActionScript headers.
          getTokenRequest.requestHeaders.push(new URLRequestHeader('Authorization', 'AuthSub token="' + singleUseToken + '"'));
    
          // Create the loader to get the token itself. The loader will callback
          // to the following event handlers if and when the server responds.
          var getToken : URLLoader = new URLLoader();
          getToken.addEventListener(Event.COMPLETE, onGetTokenResult);
          getToken.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onGetTokenFailed);
          getToken.addEventListener(IOErrorEvent.IO_ERROR, onGetTokenFailed);
    
          try {
            getToken.load(getTokenRequest);
          } catch (e : Error) {
            Alert.show('Some error occurred: ' + e);
          }
    
    

    عرض النموذج الكامل

    من المفترض أن تحفظ طريقة مثل معالج onGetTokenResult الرمز المميز الذي تم عرضه:

        private function onGetTokenResult(e : Event) : void {
          // Load the parameters from the response.
          var getToken : URLLoader = URLLoader(e.target);
          var params : URLVariables = new URLVariables(getToken.data);
    
          // Parse the session token from the result. Real applications
          // might at this point store the token in a long-term cookie so
          // that repeated usages of the application do not require this entire
          // authentication process.
          sessionToken = params.Token;
    
          // Trim the newline from the end of the session token.
          sessionToken = sessionToken.substring(0, sessionToken.length - 1);
       }
    
    

    عرض النموذج الكامل

    ملاحظات:

    • نوصي بشدة أن يخزّن التطبيق الرمز المميز على المدى الطويل في ملف تعريف ارتباط وأن يتحقق منه قبل فحص الرمز المميز على المدى القصير؛ حيث يمنع ذلك المستخدمين من زيارة صفحة تأكيد AuthSub في كل مرة يريدون فيها استخدام تطبيقك.

  4. استخدام الرمز المميز للمصادقة:

    لاستخدام الرمز المميز للمصادقة، يمكنك إرفاقه عبر عنوان Authorization إلى أي طلبات يتم تقديمها إلى خدمة Google:

    Authorization: AuthSub token="(session token goes here)"

    مثال على ActionScript لخدمة الصور:

          // Prepare a request to the photos API for the private album
          // of the user.
          var albumRequest : URLRequest = new URLRequest('http://photos.googleapis.com/data/feed/api/user/default');
          albumRequest.data = new URLVariables('access=private&v=2&err=xml');
    
          // Due to a bug in Flash, a URLRequest with a GET request will
          // not properly send headers. We therefore use POST for this and *ALL*
          // requests.
          albumRequest.method = URLRequestMethod.POST;
    
          var authsubHeader : String = 'AuthSub token="' + sessionToken + '"';
    
          // Add the Authorization header which uses the session token.
          albumRequest.requestHeaders.push(new URLRequestHeader('Authorization', authsubHeader));
    
          // The X-HTTP-Method-Override header tells the Photos API to treat this request
          // as a GET request, even though it is being conducted as a POST (due to the bug
          // mentioned above). This is very important, as GData APIs will react differently
          // to different HTTP request types.
          albumRequest.requestHeaders.push(new URLRequestHeader('X-HTTP-Method-Override', 'GET'));
    
          // We expect ATOM XML to be returned.
          albumRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'application/atom+xml'));
    
    

    عرض النموذج الكامل

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

لمحة عن الرموز المميزة

يصف هذا القسم الرموز المميزة التي يستخدمها AuthSub في ActionScript. في معظم السياقات، لن تحتاج إلى معرفة هذه المعلومات.

ويكون كل رمز مميز للمصادقة خاصًا بالبيانات التالية:

  • نطاق خدمة Google
  • حساب Google للمستخدم
  • تطبيق عميل

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

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

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

قد تسمح بعض خدمات Google بالدخول إلى تطبيقات الويب المسجلة فقط والتي تستخدم رموزًا مميزة آمنة. AuthSub for ActionScript غير متاحة لهذه الخدمات. لاستخدام الرموز المميزة الآمنة، على مؤسستك تسجيل شهادة طبقة المقابس الآمنة مع Google وتوقيع جميع الطلبات لخلاصات البيانات هذه.

الرجوع إلى الأعلى