Ten dokument opisuje, jak korzystać z systemu uwierzytelniania AuthSub Google w aplikacji Flash lub Silverlight.
Uwaga: jeśli znasz już AuthSub, usługę Google do uwierzytelniania kont w aplikacjach internetowych, zauważysz, że AuthSub dla ActionScript jest pod względem koncepcyjnym bardzo podobny. Podstawowa implementacja jest inna, ale z punktu widzenia dewelopera aplikacji klienckiej różnice te nie mają znaczenia. W niektórych dokumentach, w kontekstach, w których rozróżnienie nie ma znaczenia, używamy skrótu „AuthSub” w odniesieniu do AuthSub dla ActionScript.
Interfejs AuthSub dla ActionScript umożliwia aplikacjom Flash lub Silverlight uwierzytelnianie w chronionych kanałach interfejsu Google Data API w imieniu użytkownika. Aby zachować wysoki poziom bezpieczeństwa, interfejs umożliwia aplikacji uzyskanie tokena uwierzytelniania bez konieczności obsługi informacji logowania na konto użytkownika.
AuthSub for ActionScript to odmiana AuthSub for JavaScript. Podobnie jak AuthSub w przypadku JavaScriptu zapewnia on metodę uwierzytelniania aplikacji klienckich w różnych domenach 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 zamiast www.google.com) i udostępnia plik crossdomain.xml, który umożliwia dostęp do tej domeny z zewnętrznych witryn.
Więcej informacji o korzystaniu ze wszystkich interfejsów API usługi uwierzytelniania znajdziesz w grupie interfejsów API kont Google.
Odbiorcy
Ten dokument jest przeznaczony dla programistów, którzy tworzą aplikacje internetowe w technologii Flash lub Silverlight, które uzyskują dostęp do usług Google.
W tym dokumencie zakłada się, że znasz ogólne założenia protokołu interfejsów API danych Google i interfejsu AuthSub. Zakładamy też, że znasz język ActionScript.
Obsługiwane środowiska
AuthSub w ActionScript jest obecnie obsługiwany w Firefoxie 1.5 i nowszym oraz w Internet Explorerze 6.0 i nowszym z Flash 9.0 lub nowszym albo Silverlight 2.0 lub nowszym.
Jak działa AuthSub w przypadku ActionScriptu
Oto krótkie podsumowanie sposobu komunikacji między aplikacją internetową, usługą uwierzytelniania Google i usługą danych Google:
- Aby uzyskać dostęp do usługi Google Data w imieniu użytkownika, aplikacja internetowa musi mieć ważny token uwierzytelniania. Aplikacje zwykle przechowują ten token w pliku cookie. Jeśli taki plik nie istnieje, aplikacja internetowa musi uzyskać token za pomocą AuthSub. Aby uzyskać token, aplikacja internetowa wywołuje funkcję logowania AuthSub for ActionScript w usłudze uwierzytelniania, podając usługę, do której ma uzyskać dostęp.
- Po otrzymaniu żądania z aplikacji internetowej usługa uwierzytelniania przekierowuje użytkownika na stronę „Żądanie dostępu”. Na tej stronie użytkownik jest proszony o zalogowanie się na konto Google oraz o przyznanie lub odmowę dostępu do usługi Google.
- Użytkownik decyduje, czy przyznać dostęp do aplikacji internetowej. Jeśli użytkownik odmówi dostępu, zostanie przekierowany na stronę Google, a nie z powrotem do aplikacji internetowej.
- Jeśli użytkownik zaloguje się i przyzna dostęp, usługa uwierzytelniania przekieruje go z powrotem do adresu URL aplikacji internetowej, która wykonała pierwotne wywołanie. Przekierowanie dostarcza token uwierzytelniania dla określonej usługi za pomocą parametru zapytania. Aplikacja powinna przechowywać token jako plik cookie w przeglądarce użytkownika w domenie aplikacji internetowej. Token jest ważny do momentu unieważnienia. (Wskazówki dotyczące tego, kiedy anulować tokeny, znajdziesz w sekcji Informacje o tokenach).
- Aplikacja internetowa kontaktuje się z usługą danych Google i wysyła token uwierzytelniania wraz z każdym żądaniem wysyłanym do tej usługi.
- Jeśli usługa Google Data rozpozna token, przesyła dane, o które prosisz.
Korzystanie z interfejsu AuthSub dla ActionScript
AuthSub dla ActionScript, czyli AuthSubAS, udostępnia punkt końcowy AuthSub w różnych domenach dla aplikacji Flash (lub Silverlight), które korzystają z interfejsów Google Data API.
AuthSubAS udostępnia kopię punktów końcowych AuthSub znajdujących się na stronie google.com, a także dodatkowy plik crossdomain.xml, który umożliwia Flashowi (lub Silverlightowi) dostęp do tych punktów końcowych. Na przykład punkt końcowy AuthSubSessionToken można wykorzystać, uzyskując dostęp do adresu https://accounts.googleapis.com/accounts/AuthSubSessionToken.
Poniżej znajdziesz instrukcje uzyskiwania tokena uwierzytelniającego i używania go do uzyskiwania dostępu do usługi Google z aplikacji Flash.
- Skonfiguruj zasady dotyczące wielu domen.
Aby używać Flasha w sposób obejmujący wiele domen, musi on zostać zainicjowany za pomocą zasad dla każdej zewnętrznej domeny, do której ma być uzyskiwany dostęp. Aby to zrobić, wywołaj metodę ActionScript
Security.loadPolicyFile(policy)dla każdej domeny, np. tak:<?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'); }
Zwróć uwagę, że w tym przypadku wczytujemy zasady dla
accounts.googleapis.com(AuthSubAS) iphotos.googleapis.com/data(PicasaWeb, do którego przykład uzyskuje dostęp później). - Poproś o token jednorazowy.
Pierwszym krokiem w procesie AuthSub jest wysłanie do punktu końcowego AuthSub żądania tokena jednorazowego użytku. Aplikacja powinna to zrobić, wywołując połączenie z punktem końcowym
AuthSubRequestw ten sposób: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');
Ta metoda wymaga wartości zakresu. Każda usługa Google określa zakres dostępu, który umożliwia, i musisz odwołać się do tego zakresu w żądaniu tokena. Aby określić, jakiej wartości zakresu użyć, zapoznaj się z dokumentacją usługi Google, do której chcesz uzyskać dostęp. Zakres wygląda jak adres URL. Może to być prosty adres URL identyfikujący usługę lub może on określać bardziej ograniczony dostęp, np. tylko do odczytu. Jeśli usługa oferuje wybór zakresów, poproś o token o najwęższym możliwym zakresie. 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 udostępnienie przycisku logowania lub innego mechanizmu wprowadzania danych przez użytkownika, aby zachęcić go do ręcznego rozpoczęcia procesu logowania. Jeśli natomiast zaznaczysz to pole i przekierujesz użytkownika od razu po wczytaniu strony, bez czekania na jego interakcję, to pierwszą rzeczą, jaką zobaczy on po wejściu na Twoją stronę, będzie strona logowania w Google. Jeśli użytkownik zdecyduje się nie logować, Google nie przekieruje go z powrotem na Twoją stronę. Z jego punktu widzenia próbował on odwiedzić Twoją stronę, ale został odesłany i nigdy nie wrócił. Może to dezorientować i frustrować użytkowników.
- Aplikacje, które potrzebują dostępu do więcej niż jednej usługi Google dla użytkownika, muszą wysyłać prośbę o nowy token dla każdej nowej usługi (ponieważ każda usługa ma inny zakres).
- Poproś o token uwierzytelniania.
Punkt końcowy
AuthSubRequestzwróci do aplikacji token jednorazowego użytku, ustawiając adres URL przeglądarki użytkownika nahttp://yourWebAppUrl?token=singleUseToken. Gdy aplikacja otrzyma token jednorazowy, musi go wymienić na token wielokrotnego użytku (o długim okresie ważności), którego można następnie używać do wysyłania żądań do plików danych Google. Aby to zrobić, wywołaj metodęAuthSubSessionTokenza pomocą tokena jednorazowego użytku.Gdy aplikacja jest wczytywana, powinna sprawdzać, czy adres URL zawiera parametr
token: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 ... }Jeśli token zostanie znaleziony, należy wywołać metodę, np.
getLongLivedToken, która wywołuje punkt końcowyAuthSubSessionToken: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); }
Metoda taka jak moduł obsługi
onGetTokenResultpowinna zapisywać zwrócony 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); }
Wskazówki:
- Zdecydowanie zalecamy, aby aplikacja przechowywała token długoterminowy w pliku cookie i sprawdzała go przed sprawdzeniem tokena krótkoterminowego. Dzięki temu użytkownicy nie będą musieli odwiedzać strony potwierdzenia AuthSub za każdym razem, gdy będą chcieli użyć aplikacji.
- Używanie tokena uwierzytelniania
Aby użyć tokena uwierzytelniania, dołącz go w nagłówku
Authorizationdo wszystkich żądań wysyłanych do usługi Google:Authorization: AuthSub token="(session token goes here)"
Przykład w ActionScript 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'));
Google zaleca udostępnienie funkcji ręcznego wylogowywania, np. przycisku wylogowywania lub klikalnego linku. Dzięki temu użytkownicy mogą wylogować się w dowolnym momencie lub pozostać zalogowani i mieć wygodny dostęp do swoich kanałów danych przy następnym otwarciu aplikacji.
Informacje o tokenach
W tej sekcji opisujemy tokeny używane przez AuthSub w przypadku ActionScript. W większości przypadków nie musisz znać tych informacji.
Każdy token uwierzytelniający jest powiązany z tymi danymi:
- Zakres usługi Google
- Konto Google użytkownika
- Aplikacja kliencka
Dane tokena zapewniają, że tylko określona aplikacja innej firmy może prosić o dane, a żądanie jest ograniczone do danych z określonego zakresu i konta użytkownika.
W danym momencie może być ważny tylko 1 token dla tej kombinacji zakresu, użytkownika i klienta. Aplikacja internetowa musi za każdym razem prosić o nowy token, gdy potrzebuje dostępu 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 ograniczać dostęp do określonych typów danych lub aktywności, np. tylko do odczytu.
Token zwrócony przez interfejs AuthSub dla ActionScript może być używany dowolną liczbę razy, dopóki nie zostanie unieważniony. To aplikacja zarządza żywotnością tokena, równoważąc bezpieczeństwo z wygodą. Google zaleca, aby za każdym razem, gdy rozpoczyna się nowa sesja, prosić o nowy token.
Niektóre usługi Google mogą zezwalać na dostęp tylko aplikacjom internetowym, które są zarejestrowane i używają bezpiecznych tokenów. W przypadku takich usług AuthSub dla ActionScript nie jest obsługiwany. Aby używać bezpiecznych tokenów, Twoja organizacja musi zarejestrować w Google certyfikat SSL i podpisywać wszystkie żądania dotyczące tych plików danych.