Sử dụng AuthSub trong ActionScript

Tài liệu này mô tả cách sử dụng hệ thống xác thực AuthSub của Google từ một ứng dụng Flash hoặc Silverlight.

Lưu ý: Nếu đã quen thuộc với AuthSub, dịch vụ xác thực tài khoản của Google cho các ứng dụng dựa trên web, bạn sẽ thấy rằng AuthSub cho ActionScript có khái niệm rất giống nhau. Việc triển khai cơ bản là khác nhau, nhưng những điểm khác biệt này không quan trọng đối với bạn với tư cách là nhà phát triển ứng dụng khách. Trong một số tài liệu, trong những ngữ cảnh không cần phân biệt, chúng tôi gọi AuthSub cho ActionScript là "AuthSub" cho ngắn gọn.

Giao diện AuthSub cho ActionScript cho phép các ứng dụng Flash hoặc Silverlight xác thực với các nguồn cấp dữ liệu được bảo vệ của Google Data API thay cho người dùng. Để duy trì mức độ bảo mật cao, giao diện này cho phép ứng dụng nhận mã thông báo xác thực mà không cần xử lý thông tin đăng nhập tài khoản của người dùng.

AuthSub cho ActionScript là một biến thể của AuthSub cho JavaScript. Giống như AuthSub cho JavaScript, phương thức này cung cấp một phương thức trên nhiều miền để các ứng dụng khách xác thực từ một trang web được lưu trữ trên một miền không phải của Google. AuthSub khác với AuthSub tiêu chuẩn ở chỗ dịch vụ xác thực nằm trên một miền khác (accounts.googleapis.com thay vì www.google.com) và cung cấp một tệp crossdomain.xml cho phép truy cập vào miền đó từ các trang web bên ngoài.

Bạn cũng có thể xem Nhóm API Tài khoản Google để thảo luận về cách sử dụng tất cả các API dịch vụ Xác thực.

Đối tượng

Tài liệu này dành cho những lập trình viên đang phát triển các ứng dụng web Flash hoặc Silverlight có quyền truy cập vào các dịch vụ của Google.

Tài liệu này giả định rằng bạn hiểu những ý tưởng chung đằng sau giao thức API dữ liệu của Googlegiao diện AuthSub. Hướng dẫn này cũng giả định rằng bạn biết cách lập trình bằng ActionScript.

Các môi trường được hỗ trợ

AuthSub cho ActionScript hiện được hỗ trợ trong Firefox 1.5 trở lên và Internet Explorer 6.0 trở lên, với Flash 9.0 trở lên hoặc Silverlight 2.0 trở lên.

Cách hoạt động của AuthSub cho ActionScript

Sau đây là thông tin tóm tắt nhanh về cách giao tiếp giữa một ứng dụng web, dịch vụ Xác thực của Google và một dịch vụ Dữ liệu của Google:

  1. Để truy cập vào một dịch vụ Dữ liệu của Google thay mặt cho người dùng, ứng dụng web phải có mã thông báo xác thực hợp lệ. Thông thường, các ứng dụng lưu trữ mã thông báo này trong cookie; nếu không có cookie như vậy, ứng dụng web phải lấy mã thông báo thông qua AuthSub. Để lấy mã thông báo, ứng dụng web sẽ thực hiện lệnh gọi đăng nhập AuthSub cho ActionScript đến Dịch vụ xác thực, chỉ định dịch vụ cần truy cập.
  2. Khi nhận được yêu cầu từ ứng dụng web, Dịch vụ xác thực sẽ chuyển hướng người dùng đến trang "Yêu cầu cấp quyền truy cập". Trang này nhắc người dùng đăng nhập vào Tài khoản Google của họ và yêu cầu họ cấp hoặc từ chối quyền truy cập vào dịch vụ của Google.
  3. Người dùng quyết định xem có cấp hay từ chối quyền truy cập vào ứng dụng web hay không. Nếu từ chối cấp quyền truy cập, người dùng sẽ được chuyển hướng đến một trang của Google thay vì quay lại ứng dụng web.
  4. Nếu người dùng đăng nhập thành công và cấp quyền truy cập, thì Dịch vụ xác thực sẽ chuyển hướng người dùng trở lại URL của ứng dụng web đã thực hiện lệnh gọi ban đầu. Lệnh chuyển hướng sẽ gửi mã xác thực cho dịch vụ được chỉ định thông qua một tham số truy vấn. Ứng dụng phải lưu trữ mã thông báo dưới dạng cookie trong trình duyệt của người dùng, trong miền của ứng dụng web. Mã thông báo có hiệu lực cho đến khi bị thu hồi. (Xem phần Giới thiệu về mã thông báo để biết lời khuyên về thời điểm thu hồi mã thông báo.)
  5. Ứng dụng web liên hệ với dịch vụ Google Data và gửi mã xác thực cùng với mỗi yêu cầu được gửi đến dịch vụ này.
  6. Nếu nhận ra mã thông báo, dịch vụ Dữ liệu của Google sẽ cung cấp dữ liệu được yêu cầu.

Sử dụng AuthSub cho giao diện ActionScript

AuthSub cho ActionScript (hay AuthSubAS) cung cấp một điểm cuối AuthSub trên nhiều miền cho các ứng dụng Flash (hoặc Silverlight) sử dụng Google Data API.

AuthSubAS cung cấp bản sao của các điểm cuối AuthSub trên google.com, kèm theo một tệp crossdomain.xml bổ sung cho phép Flash (hoặc Silverlight) truy cập vào các điểm cuối đó. Ví dụ: bạn có thể sử dụng điểm cuối AuthSubSessionToken bằng cách truy cập vào https://accounts.googleapis.com/accounts/AuthSubSessionToken.

Các bước sau đây sẽ hướng dẫn quy trình lấy mã xác thực và sử dụng mã này để truy cập vào một dịch vụ của Google từ một ứng dụng Flash.

  1. Thiết lập chính sách trên nhiều miền.

    Để sử dụng Flash theo cách liên miền, bạn phải khởi tạo Flash bằng một policy cho mỗi miền bên ngoài cần truy cập. Để thực hiện việc này, hãy gọi phương thức ActionScript Security.loadPolicyFile(policy) cho từng miền, như sau:

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

    Xem mẫu đầy đủ

    Xin lưu ý rằng ở đây, chúng ta đang tải chính sách cho accounts.googleapis.com (AuthSubAS) và cho photos.googleapis.com/data (PicasaWeb, mà ví dụ sẽ truy cập sau).

  2. Yêu cầu mã thông báo dùng một lần.

    Bước đầu tiên trong quy trình AuthSub là yêu cầu mã thông báo dùng một lần từ điểm cuối AuthSub. Ứng dụng của bạn phải thực hiện việc này bằng cách gọi đến điểm cuối AuthSubRequest, như sau:

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

    Xem mẫu đầy đủ

    Phương thức này yêu cầu giá trị scope. Mỗi dịch vụ của Google đều xác định phạm vi truy cập mà dịch vụ đó cho phép và bạn cần tham chiếu phạm vi đó trong yêu cầu về mã thông báo. Để xác định giá trị phạm vi cần sử dụng, hãy xem tài liệu về dịch vụ Google mà bạn muốn truy cập. Phạm vi này trông giống như một URL; đó có thể là một URL đơn giản xác định dịch vụ hoặc có thể chỉ định quyền truy cập bị hạn chế hơn, chẳng hạn như giới hạn quyền truy cập ở chế độ chỉ đọc. Khi dịch vụ cung cấp nhiều lựa chọn về phạm vi, hãy yêu cầu mã thông báo có phạm vi hẹp nhất có thể. Ví dụ: để truy cập vào nguồn cấp dữ liệu của Lịch Google, hãy sử dụng phạm vi 'http://www.google.com/calendar/feeds', chứ không phải 'http://www.google.com/calendar'.

    Mẹo:

    • Bạn nên cung cấp một nút đăng nhập hoặc cơ chế nhập liệu khác để nhắc người dùng bắt đầu quy trình đăng nhập theo cách thủ công. Nếu thay vào đó, bạn kiểm tra và chuyển hướng ngay sau khi tải mà không đợi người dùng tương tác, thì điều đầu tiên người dùng nhìn thấy khi truy cập vào trang của bạn là trang đăng nhập của Google. Nếu người dùng quyết định không đăng nhập, thì Google sẽ không chuyển hướng họ trở lại trang của bạn. Vì vậy, theo quan điểm của người dùng, họ đã cố gắng truy cập vào trang của bạn nhưng bị chuyển hướng và không bao giờ được chuyển hướng trở lại. Tình huống này có thể gây nhầm lẫn và khó chịu cho người dùng.
    • Những ứng dụng cần truy cập vào nhiều dịch vụ của Google cho một người dùng phải yêu cầu một mã thông báo mới cho mỗi dịch vụ mới (vì mỗi dịch vụ có một phạm vi khác nhau).

  3. Yêu cầu mã thông báo xác thực.

    Điểm cuối AuthSubRequest sẽ trả về mã thông báo dùng một lần cho ứng dụng của bạn bằng cách đặt URL của trình duyệt người dùng thành http://yourWebAppUrl?token=singleUseToken. Sau khi nhận được mã thông báo dùng một lần, ứng dụng của bạn phải trao đổi mã thông báo đó để lấy mã thông báo dùng nhiều lần (có thời hạn sử dụng dài). Sau đó, bạn có thể dùng mã thông báo này để đưa ra yêu cầu đối với nguồn cấp dữ liệu của Google. Để thực hiện việc này, hãy gọi phương thức AuthSubSessionToken bằng mã thông báo chỉ dùng một lần.

    Ứng dụng của bạn phải kiểm tra tham số token trong URL khi được tải:

        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 ... }

    Xem mẫu đầy đủ

    Nếu tìm thấy mã thông báo, mã này sẽ gọi một phương thức như getLongLivedToken, phương thức này sẽ gọi điểm cuối 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);
          }

    Xem mẫu đầy đủ

    Một phương thức như trình xử lý onGetTokenResult sẽ lưu mã thông báo được trả về:

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

    Xem mẫu đầy đủ

    Mẹo:

    • Bạn nên lưu trữ mã thông báo dài hạn trong cookie và kiểm tra mã thông báo này trước khi kiểm tra mã thông báo ngắn hạn; việc này giúp người dùng không phải truy cập vào trang xác nhận AuthSub mỗi khi họ muốn sử dụng ứng dụng của bạn.

  4. Sử dụng mã thông báo xác thực.

    Để sử dụng mã thông báo xác thực, hãy đính kèm mã thông báo này thông qua tiêu đề Authorization vào mọi yêu cầu gửi đến một dịch vụ của Google:

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

    Ví dụ về ActionScript cho dịch vụ 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'));

    Xem mẫu đầy đủ

  5. Bạn nên cung cấp tính năng đăng xuất thủ công, chẳng hạn như nút đăng xuất hoặc đường liên kết có thể nhấp. Cách tiếp cận này cho phép người dùng chọn đăng xuất khi họ muốn hoặc vẫn đăng nhập và giữ cho nguồn cấp dữ liệu của họ luôn sẵn sàng cho lần tiếp theo họ truy cập vào ứng dụng của bạn.

Giới thiệu về mã thông báo

Phần này mô tả các mã thông báo mà AuthSub dùng cho ActionScript. Trong hầu hết các trường hợp, bạn không cần biết thông tin này.

Mỗi mã thông báo xác thực đều dành riêng cho những dữ liệu sau:

  • Phạm vi dịch vụ của Google
  • Tài khoản Google của người dùng
  • Ứng dụng

Dữ liệu mã thông báo đảm bảo rằng chỉ ứng dụng bên thứ ba được chỉ định mới có thể yêu cầu dữ liệu và yêu cầu đó chỉ giới hạn ở dữ liệu trong phạm vi và tài khoản người dùng được chỉ định.

Tại một thời điểm bất kỳ, chỉ có một mã thông báo cho tổ hợp phạm vi, người dùng và ứng dụng này là hợp lệ. Mỗi khi cần truy cập vào một dịch vụ mới của Google cho một người dùng nhất định, ứng dụng web phải yêu cầu một mã thông báo mới. Phạm vi truy cập mà mã thông báo bao gồm phụ thuộc vào dịch vụ của Google. Dịch vụ này có thể chọn giới hạn quyền truy cập vào một số loại dữ liệu hoặc hoạt động nhất định, chẳng hạn như quyền truy cập chỉ đọc.

Bạn có thể sử dụng mã thông báo do giao diện AuthSub cho ActionScript trả về bao nhiêu lần tuỳ ý cho đến khi mã này bị thu hồi. Ứng dụng của bạn sẽ quản lý thời gian tồn tại của mã thông báo, cân bằng giữa tính bảo mật và sự thuận tiện. Google đề xuất bạn yêu cầu một mã thông báo mới mỗi khi bắt đầu một phiên mới.

Một số dịch vụ của Google có thể chỉ cho phép truy cập bằng các ứng dụng web đã đăng ký và sử dụng mã thông báo bảo mật. AuthSub cho ActionScript không được hỗ trợ cho các dịch vụ như vậy. Để sử dụng mã thông báo bảo mật, tổ chức của bạn phải đăng ký chứng chỉ SSL với Google và ký tất cả các yêu cầu đối với những nguồn cấp dữ liệu đó.

Quay lại đầu trang