Sử dụng AuthSub trong BSF

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ừ ứ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 dành cho các ứng dụng dựa trên nền tảng web, thì bạn sẽ thấy AuthSub cho MRSS rất giống nhau về mặt khái niệm. Cách triển khai cơ bản là khác, nhưng sự khác biệt không quan trọng đối với bạn với tư cách là nhà phát triển ứng dụng. Trong một số tài liệu, trong bối cảnh không có sự khác biệt không liên quan, chúng tôi gọi ngắn gọn là AuthSub cho BSF là "AuthSub.

Giao diện AuthSub cho MRSS cho phép các ứng dụng Flash hoặc Silverlight thay mặt người dùng xác thực với các nguồn cấp dữ liệu Google Data API được bảo vệ. Để duy trì mức độ bảo mật cao, giao diện 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 MRSS là một biến thể của AuthSub cho JavaScript. Giống như AuthSub cho JavaScript, cung cấp một phương thức 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. Nó 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.

Xem thêm 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 người xem

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 để truy cập các dịch vụ của Google.

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

Môi trường được hỗ trợ

AuthSub cho MRSS 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 AuthSub cho nhà hoạt động

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

  1. Để truy cập vào dịch vụ Dữ liệu của Google thay mặt người dùng, ứng dụng web phải có mã 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 một cookie; nếu không có cookie như vậy, ứng dụng web phải lấy được mã thông báo qua AuthSub. Để lấy mã thông báo, ứng dụng web thực hiện lệnh gọi đăng nhập AuthSub cho MRSS đế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 truy cập". Trang này nhắc người dùng đăng nhập vào Tài khoản Google của mình 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 việc cấp hay từ chối quyền truy cập vào ứng dụng web. Nếu người dùng từ chối quyền truy cập, họ sẽ được chuyển hướng đến một trang 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 quay lại URL ứng dụng web đã thực hiện lệnh gọi ban đầu. Lệnh chuyển hướng này phân phối mã xác thực cho dịch vụ đã chỉ định thông qua tham số truy vấn. Ứng dụng sẽ 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 này 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ụ Dữ liệu của Google và gửi mã thông báo xác thực cùng với mỗi yêu cầu được gửi đến dịch vụ.
  6. Nếu nhận ra mã thông báo, thì dịch vụ dữ liệu của Google sẽ cung cấp dữ liệu được yêu cầu.

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

AuthSub cho IdP, hoặc 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 API Dữ liệu của Google.

AuthSubAS cung cấp bản sao của các điểm cuối AuthSub được tìm thấy trên google.com, với tệp crossdomain.xml bổ sung cho phép Flash (hoặc Silverlight) truy cập 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 hướng dẫn quy trình nhận mã xác thực và sử dụng mã đó để truy cập dịch vụ của Google 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 nhiều miền, bạn phải khởi chạy Flash bằng chính sách dành cho từng miền bên ngoài sắp được truy cập. Để thực hiện việc này, hãy gọi phương thức MRSS Security.loadPolicyFile(policy) cho mỗi 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 toàn bộ mẫu

    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ụ này truy cập sau này).

  2. Yêu cầu mã 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 sử dụng một lần từ điểm cuối AuthSub. Ứng dụng sẽ thực hiện việc này bằng cách gọi lệnh gọi đến điểm cuối AuthSubRequest, chẳng hạn 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 toàn bộ mẫu

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

    Lưu ý:

    • Bạn nên cung cấp nút đăng nhập hoặc cơ chế nhập thông tin khác của người dùng để nhắc người dùng bắt đầu quá trình đăng nhập theo cách thủ công. Thay vào đó, nếu bạn kiểm tra và chuyển hướng ngay sau khi tải mà không cần chờ sự tương tác của người dùng, thì trang đầu tiên mà 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 hướng họ trở lại trang của bạn; do đó, từ quan điểm của người dùng, họ đã cố gắng truy cập trang của bạn nhưng đã bị gửi đi và không bao giờ được gửi 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.
    • Các ứ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ột mã thông báo sử 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 của 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 đổi mã thông báo đó thành mã thông báo dùng nhiều lần (dài hạn). Mã này có thể dùng để đưa ra yêu cầu cho 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 sử dụng duy nhất.

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

        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 toàn bộ mẫu

    Nếu tìm thấy, 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 toàn bộ mẫu

    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 toàn bộ mẫu

    Lưu ý:

    • Ứng dụng của bạn nên lưu trữ mã thông báo dài hạn trong một cookie và kiểm tra các mã đó trước khi kiểm tra mã thông báo ngắn hạn. Điều này ngăn người dùng 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ã này thông qua tiêu đề Authorization vào mọi yêu cầu được gửi đến một dịch vụ của Google:

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

    Ví dụ trong MRSS 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 toàn bộ mẫu

  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 vào. Phương pháp đó sẽ cho phép người dùng đăng xuất khi họ chọn, hoặc duy trì trạng thái đăng nhập, đồng thời giúp nguồn cấp dữ liệu của họ luôn tiện lợi cho lần truy cập tiếp theo 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ả mã thông báo mà AuthSub sử dụng cho MRSS. Trong hầu hết các bối cảnh, bạn không cần biết thông tin này.

Mỗi mã thông báo xác thực là 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ụ thể.

Chỉ một mã thông báo cho tổ hợp phạm vi này, người dùng và ứng dụng có thể hợp lệ bất kỳ lúc nào. Ứng dụng web phải yêu cầu mã thông báo mới 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 cụ thể. Phạm vi truy cập của mã thông báo tuỳ 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, chẳng hạn như quyền chỉ có thể đọc.

Bạn có thể sử dụng mã thông báo do giao diện AuthSub cho MRSS trả về bao nhiêu lần nếu cần cho đến khi bị thu hồi. Ứng dụng của bạn tùy thuộc vào việc quản lý thời gian của mã thông báo, cân bằng bảo mật một cách thuận tiện. Google khuyên bạn nên yêu cầu 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 những ứng dụng web đã đăng ký và sử dụng mã thông báo bảo mật truy cập. AuthSub cho MRSS 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ả yêu cầu cho các nguồn cấp dữ liệu đó.

Trở lại đầu trang