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

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

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

Интерфейс AuthSub для ActionScript позволяет приложениям Flash или Silverlight выполнять аутентификацию в защищенных фидах API данных Google от имени пользователя. Для поддержания высокого уровня безопасности интерфейс позволяет приложению получать токен аутентификации, даже не обрабатывая информацию для входа в учетную запись пользователя.

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

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

AuthSub для 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 для сервиса 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 для данного пользователя. Объем доступа, охватываемый токеном, зависит от службы Google, которая может ограничить доступ к определенным типам данных или действий, например доступ только для чтения.

Токен, возвращаемый интерфейсом AuthSub для ActionScript, можно использовать столько раз, сколько необходимо, пока он не будет отозван. Ваше приложение должно управлять сроком службы токена, сочетая безопасность и удобство. Google рекомендует запрашивать новый токен каждый раз, когда инициируется новый сеанс.

Некоторые службы Google могут разрешать доступ только веб-приложениям, которые зарегистрированы и используют безопасные токены. AuthSub для ActionScript не поддерживается для таких служб. Чтобы использовать токены безопасности , ваша организация должна зарегистрировать SSL-сертификат в Google и подписывать все запросы на эти фиды данных.

Вернуться к вершине