Używanie AuthSub w DialogScript

Ten dokument opisuje korzystanie z systemu uwierzytelniania Google AuthSub z aplikacji Flash lub Silverlight.

Uwaga: jeśli znasz już AuthSub, usługę uwierzytelniania konta Google dla aplikacji internetowych, zobaczysz, że wiele koncepcji AuthSub do debugowania jest bardzo podobne. Podstawowa implementacja różni się od siebie, ale różnice nie są ważne dla Ciebie jako dewelopera aplikacji klienckiej. W niektórych sytuacjach, gdy kontekst jest nieistotny, w języku angielskim używamy AuthSub dla JavaScriptu jako AuthSub.

Interfejs AuthSub dla JavaScriptu umożliwia aplikacjom Flash i Silverlight uwierzytelnianie w chronionych plikach danych interfejsu Google Data API w imieniu użytkownika. Aby zapewnić wysoki poziom bezpieczeństwa, interfejs umożliwia aplikacji otrzymanie tokena uwierzytelniania bez konieczności obsługi danych logowania na konto użytkownika.

AuthSub dla JavaScriptu to wariant AuthSub dla JavaScriptu. Podobnie jak AuthSub dla JavaScriptu, zapewnia metodę międzydomenową na potrzeby uwierzytelniania klientów ze strony internetowej hostowanej w domenie innej niż Google. Różni się od standardowego AuthSub tym, że usługa uwierzytelniania znajduje się w innej domenie (accounts.googleapis.com, a nie www.google.com), i udostępnia plik crossdomain.xml, który zapewnia dostęp do tej domeny z witryn zewnętrznych.

Zapoznaj się też z grupą interfejsów API kont Google, aby uzyskać informacje na temat używania wszystkich interfejsów API usługi uwierzytelniania.

Odbiorcy

Ten dokument jest przeznaczony dla programistów opracowujących aplikacje internetowe Flash lub Silverlight, które uzyskują dostęp do usług Google.

W tym dokumencie zakładamy, że rozumiesz ogólne pojęcia związane z protokołem interfejsów API danych Google i interfejsem AuthSub. Zakładamy też, że umiesz się programować w języku Script.

Obsługiwane środowiska

Protokół AuthSub jest obecnie obsługiwany w przeglądarkach Firefox 1.5 i nowszych oraz Internet Explorer 6.0 i nowszych oraz Flash 9.0 i nowszych oraz Silverlight 2.0 lub nowszych.

Jak działa AuthSub dla Dialogflow

Oto krótkie podsumowanie działania komunikacji między aplikacją internetową, usługą uwierzytelniania Google i usługą danych Google:

  1. Aby można było uzyskać dostęp do usługi danych Google w imieniu użytkownika, aplikacja internetowa musi mieć prawidłowy token uwierzytelniania. Zazwyczaj ten token jest przechowywany w pliku cookie. Jeśli taki plik nie istnieje, aplikacja internetowa musi go uzyskać za pomocą AuthSub. Aby uzyskać token, aplikacja internetowa wysyła do usługi uwierzytelniania wywołanie logowania AuthSub określające, która usługa ma zostać udostępniona.
  2. Po otrzymaniu żądania z aplikacji internetowej usługa uwierzytelniania przekierowuje użytkownika na stronę „Żądanie dostępu”. Na tej stronie wyświetla się prośba o zalogowanie się na konto Google oraz prośba o przyznanie lub zablokowanie dostępu do usługi Google.
  3. Użytkownik decyduje, czy przyznać lub zablokować dostęp do aplikacji internetowej. Jeśli użytkownik odmówi dostępu, zostanie przekierowany na stronę Google, a nie do aplikacji internetowej.
  4. Jeśli użytkownik się zaloguje i przyzna dostęp, usługa uwierzytelniania przekieruje użytkownika z powrotem do adresu URL aplikacji internetowej, która wywołała pierwotne połączenie. Przekierowanie dostarcza token uwierzytelniania określonej usługi za pomocą parametru zapytania. Aplikacja powinna zapisać token w pliku cookie przeglądarki użytkownika w domenie aplikacji internetowej. Token będzie ważny do czasu jego unieważnienia. Wskazówki na temat unieważniania tokenów znajdziesz w sekcji Informacje o tokenach.
  5. Aplikacja internetowa kontaktuje się z usługą danych Google i wysyła token uwierzytelniania wraz z każdym żądaniem wysłanym do usługi.
  6. Jeśli usługa danych Google rozpozna token, dostarczy żądane dane.

Korzystanie z interfejsu AuthSub for Script

AuthSub dla JavaScriptu lub AuthSubAS zapewnia międzydomenowy punkt końcowy AuthSub dla aplikacji Flash (lub Silverlight), które korzystają z interfejsów API danych Google.

AuthSubAS zapewnia kopię punktów końcowych AuthSub znalezionych na google.com oraz dodatkowy plik crossdomain.xml, który umożliwia Flashowi (lub Silverlight) dostęp do tych punktów końcowych. Możesz na przykład użyć punktu końcowego AuthSubSessionToken na stronie https://accounts.googleapis.com/accounts/AuthSubSessionToken.

Poniższe kroki przedstawiają proces uzyskiwania tokena uwierzytelniania i korzystania z niego w celu uzyskania dostępu do usługi Google z aplikacji Flash.

  1. Skonfiguruj zasady obejmujące wiele domen

    Aby używać Flasha w różnych domenach, musisz go zainicjować za pomocą zasad dla każdej domeny, do której chcesz uzyskać dostęp. Aby to zrobić, wywołaj metodę Script Security.loadPolicyFile(policy) dla każdej domeny, na przykład:

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

    Zobacz pełną próbkę

    Zasada jest wczytywana tutaj dla zasad accounts.googleapis.com (AuthSubAS) i photos.googleapis.com/data (PicasaWeb, do których przykład ma później dostęp).

  2. Poproś o token jednorazowego użytku

    Pierwszym krokiem w procesie AuthSub jest wysłanie żądania pojedynczego tokena z punktu końcowego AuthSub. Aplikacja powinna to zrobić przez wywołanie wywołania punktu końcowego AuthSubRequest, na przykład:

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

    Zobacz pełną próbkę

    Ta metoda wymaga wartości zakresu. Każda usługa Google określa zakres dostępu, do którego zezwala, i musisz odwoływać się do tego zakresu w żądaniu tokena. Aby określić wartość zakresu, zapoznaj się z dokumentacją usługi Google, do której chcesz uzyskać dostęp. Zakres ten wygląda jak adres URL. Może to być prosty adres URL identyfikujący usługę lub może mieć bardziej ograniczony dostęp, taki jak ograniczenie dostępu tylko do odczytu. Gdy usługa oferuje wybór zakresów, poproś o najwęższy zakres tokena. Aby na przykład uzyskać dostęp do plików danych Kalendarza Google, użyj zakresu 'http://www.google.com/calendar/feeds', a nie 'http://www.google.com/calendar'.

    Wskazówki:

    • Zdecydowanie zalecamy podanie przycisku logowania lub innego mechanizmu wprowadzania danych, który pozwoli użytkownikowi ręcznie rozpocząć proces logowania. Jeśli jednak zamiast tego sprawdzasz i przekierowujesz aplikację od razu po jej wczytaniu bez oczekiwania na interwencję, pierwszą rzeczą, jaką użytkownik zobaczy na stronie docelowej, jest strona logowania Google. Jeśli użytkownik się nie zaloguje, Google nie przekieruje go z powrotem na Twoją stronę. Z perspektywy użytkownika próbował on odwiedzić Twoją stronę, ale został przekierowany i nigdy nie wrócił. Scenariusz ten może być mylący i frustrujący dla użytkowników.
    • Aplikacje, które mają dostęp do więcej niż jednej usługi Google dla danego użytkownika, muszą prosić o nowy token dla każdej nowej usługi (bo każda usługa ma inny zakres).

  3. Poproś o token uwierzytelniania.

    Punkt końcowy AuthSubRequest zwróci do aplikacji token jednorazowego użytku, ustawiając adres URL przeglądarki użytkownika na wartość http://yourWebAppUrl?token=singleUseToken. Gdy aplikacja otrzyma token do jednorazowego użytku, musi wymienić go na token wielokrotnego użytku, który może później służyć do wysyłania żądań związanych z plikami danych Google. Aby to zrobić, wywołaj metodę AuthSubSessionToken za pomocą pojedynczego tokena użycia.

    Aplikacja powinna sprawdzać parametr token po wczytaniu:

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

    Zobacz pełną próbkę

    Jeśli token zostanie znaleziony, powinien wywołać metodę podobną do getLongLivedToken, która wywołuje punkt końcowy 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);
          }
    
    

    Zobacz pełną próbkę

    Metoda takiego jak moduł obsługi onGetTokenResult powinna zapisać zwracany token:

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

    Zobacz pełną próbkę

    Wskazówki:

    • Zdecydowanie zalecamy, aby aplikacja przechowywała długoterminowy token w pliku cookie i sprawdzał go przed sprawdzeniem tokena krótkoterminowego. Dzięki temu użytkownicy nie muszą odwiedzać strony potwierdzenia AuthSub za każdym razem, gdy chcą skorzystać z Twojej aplikacji.

  4. Używanie tokena uwierzytelniania.

    Aby używać tokena uwierzytelniania, dołącz go do nagłówka Authorization w przypadku wszystkich żądań wysyłanych do usługi Google:

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

    Przykład w kodzie SQL dla usługi Zdjęcia:

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

    Zobacz pełną próbkę

  5. Google zaleca udostępnienie funkcji wylogowania ręcznego, np. przycisku wylogowania lub linku, który można kliknąć. Takie podejście daje użytkownikom możliwość wylogowania się, gdy chce, lub pozostawania zalogowanych, dzięki czemu pliki danych są łatwo dostępne przy następnym uruchomieniu aplikacji.

Informacje o tokenach

W tej sekcji opisano tokeny używane przez AuthSub w DialogScript. W większości przypadków nie musisz ich znać.

Każdy token uwierzytelniania zależy od tych danych:

  • Zakres usług Google
  • Konto Google użytkownika
  • Aplikacja kliencka

Dane tokena gwarantują, że tylko określona aplikacja innej firmy może prosić o dostęp do danych, a żądanie jest ograniczone do danych pochodzących z określonego zakresu i z określonego konta użytkownika.

Tylko jeden token dla tej kombinacji zakresu, użytkownika i klienta może być ważny w danym momencie. Aplikacja internetowa musi zażądać nowego tokena za każdym razem, gdy chce mieć dostęp do nowej usługi Google dla danego użytkownika. Zakres dostępu objęty tokenem zależy od usługi Google, która może ograniczyć dostęp do określonych typów danych lub aktywności, takich jak dostęp tylko do odczytu.

Tokenu zwróconego przez interfejs AuthSub dla Dialogflow może być dowolną liczbę razy do momentu jego unieważnienia. To Ty odpowiadasz za zarządzanie tokenem życia, zachowując równowagę między bezpieczeństwem a wygodą. Google zaleca zgłaszanie prośby o nowy token przy każdym inicjowaniu nowej sesji.

Niektóre usługi Google mogą zezwalać na dostęp tylko aplikacjom zarejestrowanym i używającym bezpiecznych tokenów. Uwierzytelnianie AuthSub dla Script nie jest dostępne w tych usługach. Aby używać bezpiecznych tokenów, Twoja organizacja musi zarejestrować certyfikat SSL w Google i podpisać wszystkie żądania dotyczące tych plików danych.

Powrót do góry