การใช้ AuthSub ใน AJAX

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

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

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

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

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

ผู้ชม

เอกสารนี้มีจุดมุ่งหมายสําหรับโปรแกรมเมอร์ที่กําลังพัฒนาเว็บแอปพลิเคชัน Flash หรือ Silverlight ที่เข้าถึงบริการของ Google

เอกสารนี้จะถือว่าคุณเข้าใจแนวคิดทั่วไปเบื้องหลังโปรโตคอล Google Data API และอินเทอร์เฟซ AuthSub และจะถือว่าคุณรู้วิธีเขียนโปรแกรมใน AJAX ด้วย

สภาพแวดล้อมที่รองรับ

ขณะนี้ AuthSub สําหรับ Action ได้รับการรองรับใน Firefox 1.5 ขึ้นไปและ Internet Explorer 6.0 ขึ้นไป พร้อม Flash 9.0 ขึ้นไปหรือ Silverlight 2.0 ขึ้นไป

วิธีการทํางานของ AuthSub สําหรับ Action

ข้อมูลสรุปสั้นๆ เกี่ยวกับวิธีการทํางานของการสื่อสารระหว่างเว็บแอปพลิเคชัน บริการการตรวจสอบสิทธิ์ของ Google และบริการข้อมูลของ Google มีดังนี้

  1. หากต้องการเข้าถึงบริการข้อมูลของ Google ในนามของผู้ใช้ เว็บแอปพลิเคชันต้องมีโทเค็นการตรวจสอบสิทธิ์ที่ถูกต้อง โดยทั่วไป แอปพลิเคชันจะจัดเก็บโทเค็นนี้ไว้ในคุกกี้ หากไม่มีคุกกี้ดังกล่าว เว็บแอปพลิเคชันจะต้องรับโทเค็นผ่าน AuthSub ในการรับโทเค็น เว็บแอปพลิเคชันจะเรียกใช้การเข้าสู่ระบบ AuthSub for Action ในบริการการตรวจสอบสิทธิ์ โดยระบุบริการที่ต้องการเข้าถึง
  2. เมื่อได้รับคําขอจากเว็บแอปพลิเคชัน บริการตรวจสอบสิทธิ์จะเปลี่ยนเส้นทางผู้ใช้ไปยังหน้า "คําขอเข้าถึง" หน้าเว็บนี้จะแจ้งให้ผู้ใช้เข้าสู่ระบบบัญชี Google และขอให้อนุญาตหรือปฏิเสธการเข้าถึงบริการของ Google
  3. ผู้ใช้เลือกได้ว่าจะให้สิทธิ์หรือปฏิเสธการเข้าถึงเว็บแอปพลิเคชัน หากผู้ใช้ปฏิเสธการเข้าถึง ระบบจะนําผู้ใช้ไปยังหน้า Google แทนกลับไปยังเว็บแอปพลิเคชัน
  4. หากผู้ใช้เข้าสู่ระบบและให้สิทธิ์เข้าถึงเรียบร้อยแล้ว บริการการตรวจสอบสิทธิ์จะเปลี่ยนเส้นทางผู้ใช้กลับไปยัง URL ของเว็บแอปพลิเคชันที่เรียกครั้งแรก การเปลี่ยนเส้นทางจะส่งโทเค็นการตรวจสอบสิทธิ์สําหรับบริการที่ระบุผ่านพารามิเตอร์การค้นหา แอปพลิเคชันควรจัดเก็บโทเค็นเป็นคุกกี้ในเบราว์เซอร์ของผู้ใช้ภายใต้โดเมนเว็บแอปพลิเคชัน โทเค็นจะใช้ได้จนกว่าจะมีการเพิกถอน (ดูคําแนะนําในหัวข้อเกี่ยวกับโทเค็นเพื่อเพิกถอนโทเค็น)
  5. เว็บแอปพลิเคชันจะติดต่อบริการข้อมูลของ Google และส่งโทเค็นการตรวจสอบสิทธิ์พร้อมด้วยคําขอแต่ละรายการที่ส่งไปยังบริการ
  6. หากบริการข้อมูลของ Google รู้จักโทเค็น จะมีการส่งข้อมูลที่ขอ

การใช้อินเทอร์เฟซ AuthSub สําหรับ Action

AuthSub for Action หรือ AuthSubAS จะมีปลายทาง AuthSub ข้ามโดเมนสําหรับแอปพลิเคชัน Flash (หรือ Silverlight) ที่ใช้ Google Data API

AuthSubAS มีฟีเจอร์มิเรอร์ของปลายทาง AuthSub ที่พบใน google.com โดยมีไฟล์ crossdomain.xml เพิ่มเติมที่ช่วยให้ Flash (หรือ Silverlight) เข้าถึงปลายทางเหล่านั้นได้ เช่น ปลายทาง AuthSubSessionToken สามารถใช้โดยการเข้าถึง https://accounts.googleapis.com/accounts/AuthSubSessionToken

ขั้นตอนต่อไปนี้จะแนะนําขั้นตอนในการรับโทเค็นการตรวจสอบสิทธิ์และใช้โทเค็นนั้นเพื่อเข้าถึงบริการของ Google จากแอปพลิเคชัน Flash

  1. ตั้งค่านโยบายข้ามโดเมน

    หากต้องการใช้ Flash ในลักษณะข้ามโดเมน คุณจะต้องเริ่มต้นด้วยนโยบายสําหรับโดเมนภายนอกแต่ละโดเมนที่เข้าถึงได้ โดยเรียกใช้เมธอด ValueTrack 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)"

    ตัวอย่างใน AJAX สําหรับบริการ 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 ใช้สําหรับโทเค็น ในบริบทส่วนใหญ่ คุณไม่จําเป็นต้องทราบข้อมูลนี้

โทเค็นการตรวจสอบสิทธิ์แต่ละรายการจะมีไว้สําหรับข้อมูลต่อไปนี้เท่านั้น

  • ขอบเขตบริการของ Google
  • บัญชี Google ของผู้ใช้
  • แอปพลิเคชันไคลเอ็นต์

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

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

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

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

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