Использование AuthSub в ActionScript

В этом документе описывается, как использовать систему аутентификации Google AuthSub в приложениях Flash или Silverlight.

Примечание : Если вы уже знакомы с AuthSub, сервисом аутентификации учетных записей Google для веб-приложений , вы заметите, что AuthSub для ActionScript концептуально очень похож. Базовая реализация отличается, но эти различия не важны для вас как для разработчика клиентских приложений. В некоторых документах, в контекстах, где это различие не имеет значения, мы называем AuthSub для ActionScript сокращенно "AuthSub".

Интерфейс AuthSub for 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 API и интерфейса 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 for ActionScript для входа в систему к сервису аутентификации, указывая сервис, к которому необходимо получить доступ.
  2. Получив запрос от веб-приложения, служба аутентификации перенаправляет пользователя на страницу «Запрос на доступ». На этой странице пользователю предлагается войти в свою учетную запись Google и предоставить или отказать в доступе к своему сервису Google.
  3. Пользователь решает, разрешить или запретить доступ к веб-приложению. Если пользователь запрещает доступ, он перенаправляется на страницу Google, а не обратно в веб-приложение.
  4. Если пользователь успешно входит в систему и предоставляет доступ, служба аутентификации перенаправляет его обратно на URL-адрес веб-приложения, которое выполнило первоначальный вызов. Перенаправление передает токен аутентификации для указанной службы через параметр запроса. Приложение должно хранить токен в виде cookie в браузере пользователя под доменом веб-приложения. Токен действителен до тех пор, пока не будет отозван. (См. раздел «О токенах» для получения рекомендаций о том, когда следует отзывать токены.)
  5. Веб-приложение взаимодействует со службой данных Google и отправляет токен аутентификации вместе с каждым запросом, отправленным в эту службу.
  6. Если сервис Google Data распознает токен, он предоставит запрошенные данные.

Использование интерфейса AuthSub для ActionScript

AuthSub for ActionScript, или AuthSubAS, предоставляет междоменную конечную точку AuthSub для приложений Flash (или Silverlight), использующих API данных Google.

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 для одного пользователя, следует запрашивать новый токен для каждого нового сервиса (поскольку каждый сервис имеет свою область действия).

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

    Посмотреть полный образец

    Советы :

    • Мы настоятельно рекомендуем вашему приложению хранить долгосрочный токен в cookie и проверять его перед проверкой краткосрочного токена; это позволит избежать необходимости пользователям каждый раз посещать страницу подтверждения AuthSub при использовании вашего приложения.

  4. Использование токена аутентификации.

    Для использования токена аутентификации добавьте его через заголовок Authorization к любым запросам, отправляемым к сервису Google:

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

    Пример использования сервиса «Фотографии» на ActionScript:

          // 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 и подписывать все запросы к этим каналам передачи данных.

Вернуться наверх