การใช้ AuthSub ใน ActionScript

เอกสารนี้อธิบายวิธีใช้ระบบการตรวจสอบสิทธิ์ AuthSub ของ Google จากแอปพลิเคชัน Flash หรือ Silverlight

หมายเหตุ: หากคุ้นเคยกับ AuthSub ซึ่งเป็นบริการตรวจสอบสิทธิ์บัญชีของ Google สําหรับแอปพลิเคชันบนเว็บอยู่แล้ว คุณจะเห็นว่า AuthSub สําหรับ ActionScript มีแนวคิดที่คล้ายกันมาก การติดตั้งใช้งานพื้นฐานจะแตกต่างกัน แต่ความแตกต่างดังกล่าวไม่สำคัญสำหรับคุณในฐานะนักพัฒนาแอปพลิเคชันไคลเอ็นต์ ในเอกสารบางส่วน ในบริบทที่ความแตกต่างไม่เกี่ยวข้อง เราจะเรียก AuthSub สำหรับ ActionScript ว่า "AuthSub" แบบย่อ

อินเทอร์เฟซ AuthSub สำหรับ ActionScript ช่วยให้แอปพลิเคชัน Flash หรือ Silverlight สามารถตรวจสอบสิทธิ์ฟีด Google Data API ที่ได้รับการปกป้องในนามของผู้ใช้ อินเทอร์เฟซนี้ช่วยให้แอปพลิเคชันได้รับโทเค็นการตรวจสอบสิทธิ์โดยไม่ต้องจัดการข้อมูลการเข้าสู่ระบบบัญชีของผู้ใช้ เพื่อรักษาความปลอดภัยในระดับสูง

AuthSub สำหรับ ActionScript เป็นรูปแบบหนึ่งของ AuthSub สำหรับ JavaScript เช่นเดียวกับ AuthSub สำหรับ JavaScript ซึ่งมีวิธีการข้ามโดเมนสำหรับแอปพลิเคชันไคลเอ็นต์ในการตรวจสอบสิทธิ์จากหน้าเว็บที่โฮสต์ในโดเมนที่ไม่ใช่ของ Google ซึ่งแตกต่างจาก AuthSub มาตรฐานตรงที่บริการตรวจสอบสิทธิ์อยู่ในโดเมนอื่น (accounts.googleapis.com แทนที่จะเป็น www.google.com) และมีไฟล์ crossdomain.xml ที่อนุญาตให้เข้าถึงโดเมนดังกล่าวจากเว็บไซต์ภายนอก

ดูกลุ่ม Google Accounts API เพื่อพูดคุยเกี่ยวกับการใช้ API บริการการตรวจสอบสิทธิ์ทั้งหมด

กลุ่มเป้าหมาย

เอกสารนี้มีไว้สำหรับโปรแกรมเมอร์ที่กำลังพัฒนาเว็บแอปพลิเคชัน 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 ในนามของผู้ใช้ เว็บแอปพลิเคชันต้องมีโทเค็นการตรวจสอบสิทธิ์ที่ถูกต้อง โดยปกติแล้ว แอปพลิเคชันจะจัดเก็บโทเค็นนี้ไว้ในคุกกี้ หากไม่มีคุกกี้ดังกล่าว เว็บแอปพลิเคชันจะต้องขอโทเค็นผ่าน AuthSub หากต้องการรับโทเค็น เว็บแอปพลิเคชันจะทำการเรียก AuthSub สำหรับการเข้าสู่ระบบ 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 จากแอปพลิเคชัน 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 มากกว่า 1 รายการสำหรับผู้ใช้จะต้องขอโทเค็นใหม่สำหรับแต่ละบริการใหม่ (เนื่องจากแต่ละบริการมีขอบเขตที่แตกต่างกัน)

  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 สำหรับบริการ 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 ของผู้ใช้
  • แอปพลิเคชันไคลเอ็นต์

ข้อมูลโทเค็นช่วยให้มั่นใจได้ว่ามีเพียงแอปพลิเคชันของบุคคลที่สามที่ระบุเท่านั้นที่ขอข้อมูลได้ และคำขอจะจำกัดเฉพาะข้อมูลจากขอบเขตและบัญชีผู้ใช้ที่ระบุ

โทเค็นที่ใช้ได้ในเวลาใดก็ตามจะมีเพียง 1 รายการสำหรับขอบเขต ผู้ใช้ และไคลเอ็นต์ที่รวมกันนี้ เว็บแอปพลิเคชันต้องขอโทเค็นใหม่ทุกครั้งที่ต้องการเข้าถึงบริการใหม่ของ Google สำหรับผู้ใช้ที่ต้องการ ขอบเขตการเข้าถึงที่โทเค็นครอบคลุมจะขึ้นอยู่กับบริการของ Google ซึ่งอาจเลือกจำกัดการเข้าถึงข้อมูลหรือกิจกรรมบางประเภท เช่น สิทธิ์เข้าถึงแบบอ่านอย่างเดียว

โทเค็นที่ AuthSub ส่งคืนสำหรับอินเทอร์เฟซ ActionScript สามารถใช้ได้หลายครั้งตามที่ต้องการจนกว่าจะถูกเพิกถอน แอปพลิเคชันของคุณมีหน้าที่จัดการอายุของโทเค็น โดยคำนึงถึงทั้งความปลอดภัยและความสะดวก Google ขอแนะนำให้ขอโทเค็นใหม่ทุกครั้งที่เริ่มเซสชันใหม่

บริการบางอย่างของ Google อาจอนุญาตให้เข้าถึงได้เฉพาะเว็บแอปพลิเคชันที่ลงทะเบียนและใช้โทเค็นที่ปลอดภัยเท่านั้น บริการดังกล่าวไม่รองรับ AuthSub สำหรับ ActionScript หากต้องการใช้โทเค็นที่ปลอดภัย องค์กรของคุณต้องลงทะเบียนใบรับรอง SSL กับ Google และลงนามในคำขอฟีดข้อมูลทั้งหมด

กลับไปด้านบน