שימוש ב-AuthSub ב-ActionScript

מסמך זה מתאר כיצד להשתמש במערכת האימות של AuthSub של Google מתוך יישום Flash או Silverlight.

הערה: אם כבר השתמשתם ב-AuthSub, שירות אימות החשבונות של אפליקציות מבוססות אינטרנט של Google, תראו ש-AuthSub עבור ActionScript דומה מאוד. ההטמעה הבסיסית שונה, אבל ההבדלים לא חשובים לכם כמפתחים של אפליקציות לקוח. בחלק מהמסמכים, בהקשרים שבהם ההבחנה אינה רלוונטית, אנו מתייחסים ל-AuthSub עבור ActionScript כ-"SubSub" בקיצור.

ממשק AuthSub for ActionScript מאפשר ליישומי Flash או Silverlight לאמת עדכונים של ממשק API לשילוב נתונים של Google בשם משתמש. כדי לשמור על רמת אבטחה גבוהה, הממשק מאפשר לאפליקציה לקבל אסימון אימות מבלי לטפל בפרטי ההתחברות של חשבון המשתמש.

AuthSub עבור ActionScript הוא גרסה של AuthSub עבור JavaScript. בדיוק כמו AuthSub עבור JavaScript, הוא מספק שיטה בכמה דומיינים לאימות של אפליקציות לקוח מדף אינטרנט שמתארח בדומיין שאינו של Google. הוא שונה מ-AuthSub הרגיל בכך ששירות האימות שוכן בדומיין אחר (accounts.googleapis.com במקום www.google.com) ומספק קובץ crossdomain.xml המאפשר גישה לדומיין הזה מאתרים חיצוניים.

אפשר גם לעיין בקבוצת ה-API בחשבונות Google כדי לדון בשימוש בכל ממשקי ה-API של שירות האימות.

Audience

מסמך זה מיועד למתכנתים שמפתחים יישומי אינטרנט של Flash או Silverlight שניגשים לשירותי Google.

המסמך הזה מניח שאתם מבינים את הרעיונות הכלליים שעומדים מאחורי פרוטוקול Google Data APIs וממשק AuthSub. בנוסף, הוא יוצא מנקודת הנחה שאתם יודעים לתכנת ב-ActionScript.

סביבות נתמכות

AuthSub עבור ActionScript נתמך בשלב זה ב-Firefox 1.5 ואילך וב-Internet Explorer 6.0 ואילך, עם Flash 9.0 ואילך או Silverlight 2.0 ואילך.

איך פועל AuthSub עבור ActionScript

הנה סיכום קצר של האופן שבו התקשורת פועלת בין יישום אינטרנט, שירות האימות של Google ושירות נתוני Google:

  1. כדי לגשת לשירות Google Data בשם המשתמש, חייב להיות לאפליקציית האינטרנט אסימון אימות תקף. בדרך כלל, אפליקציות מאחסנות את האסימון בקובץ cookie. אם אין קובץ cookie כזה, אפליקציית האינטרנט חייבת לקבל את האסימון דרך AuthSub. כדי להשיג אסימון, אפליקציית האינטרנט מבצעת קריאה להתחברות של AuthSub עבור ActionScript לשירות האימות, ומציינת את השירות שיש לגשת אליו.
  2. עם קבלת הבקשה מיישום האינטרנט, שירות האימות מפנה את המשתמש לדף "בקשת גישה". הדף הזה מבקש מהמשתמש להתחבר לחשבון Google שלו ומבקש לתת או לדחות את הגישה לשירות Google שלו.
  3. המשתמש מחליט אם להעניק או לדחות את הגישה לאפליקציית האינטרנט. אם המשתמש מסרב לגשת, הוא מועבר לדף Google ולא לאפליקציית האינטרנט.
  4. אם המשתמש יתחבר בהצלחה ויעניק גישה, שירות האימות יפנה את המשתמש בחזרה לכתובת האתר של אפליקציית האינטרנט שביצע את השיחה המקורית. ההפניה האוטומטית מספקת אסימון אימות עבור השירות שצוין באמצעות פרמטר שאילתה. האפליקציה צריכה לאחסן את האסימון כקובץ cookie בדפדפן של המשתמש, מתחת לדומיין של אפליקציית האינטרנט. האסימון תקף עד שהוא מבוטל. (עיינו בקטע מידע על אסימונים כדי לקבל עצות לגבי ביטול אסימונים).
  5. אפליקציית האינטרנט יוצרת קשר עם שירות הנתונים של Google ושולחת את אסימון האימות יחד עם כל בקשה שנשלחה לשירות.
  6. אם שירות הנתונים של Google מזהה את האסימון, הוא מספק את הנתונים המבוקשים.

שימוש בממשק AuthSub עבור ActionScript

AuthSub עבור ActionScript או AuthSubAS, מספק נקודת קצה ב-AuthSub בדומיינים שונים עבור יישומי Flash (או Silverlight) המשתמשים בממשקי API של נתונים של Google.

AuthSubAS מספק שיקוף של נקודות הקצה (endpoints) של AuthSub שנמצאות ב-google.com, עם קובץ crossdomain.xml נוסף שמאפשר ל-Flash (או ל-Silverlight) לגשת לנקודות הקצה האלו. לדוגמה, אפשר להשתמש בנקודת הקצה AuthSubSessionToken בכתובת https://accounts.googleapis.com/accounts/AuthSubSessionToken.

בשלבים הבאים מתבצע התהליך של קבלת אסימון אימות ושימוש בו כדי לגשת לשירות Google מיישום Flash.

  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 (PicasaWeb, שאליה ניתן לגשת אחר כך).

  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');
    
    

    הצגת דוגמה מלאה

    לשיטה הזו נדרש ערך היקף. כל שירות של 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, שמפעילה את נקודת הקצה (endpoint) 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);
          }
    
    

    הצגת דוגמה מלאה

    שיטה כמו ה-handler של 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);
       }
    
    

    הצגת דוגמה מלאה

    טיפים:

    • מומלץ מאוד שהאפליקציה שלך תאחסן את האסימון לטווח הארוך בקובץ cookie, ותבדוק אותם לפני בדיקת האסימון לטווח קצר. כך המשתמשים לא יצטרכו להיכנס לדף האישור של AuthSub בכל פעם שהם רוצים להשתמש באפליקציה.

  4. באמצעות אסימון אימות.

    כדי להשתמש באסימון האימות, יש לצרף אותו באמצעות כותרת Authorization לכל הבקשות שנשלחות לשירות של Google:

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

    דוגמה ב-ActionScript עבור שירות Google Photos:

          // 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 for ActionScript כמה פעמים שצריך עד לביטולו. האפליקציה שלכם צריכה לנהל את חיי האסימון באמצעות איזון מאובטח. Google ממליצה לבקש אסימון חדש בכל פעם שמתבצעת הפעלה חדשה.

שירותים מסוימים של Google עשויים לאפשר גישה רק ליישומי אינטרנט רשומים המשתמשים באסימונים מאובטחים. AuthSub עבור ActionScript אינו נתמך עבור שירותים כאלה. כדי להשתמש באסימונים מאובטחים, הארגון שלכם צריך לרשום אישור SSL ב-Google ולחתום על כל הבקשות לפידים של הנתונים האלה.

חזרה למעלה