Bu dokümanda, bir Flash veya Silverlight uygulamasından Google'ın AuthSub kimlik doğrulama sisteminin nasıl kullanılacağı açıklanmaktadır.
Not: Google'ın web tabanlı uygulamalar için hesap kimlik doğrulama hizmeti olan AuthSub'a aşinaysanız AuthSub for ActionScript'in kavramsal olarak çok benzer olduğunu göreceksiniz. Temel uygulama farklıdır ancak istemci uygulaması geliştirici olarak farklılıklar sizin için önemli değildir. Bazı belgelerde, ayrımın alakasız olduğu bağlamlarda, ActionScript için AuthSub'a kısaca "AuthSub" diyoruz.
AuthSub for ActionScript arayüzü, Flash veya Silverlight uygulamalarının kullanıcı adına korunan Google Data API feed'lerinde kimlik doğrulaması yapmasına olanak tanır. Kullanıcı arayüzünün yüksek güvenlik düzeyini korumak için arayüz, kullanıcının hesap giriş bilgilerini işlemeden uygulamanın bir kimlik doğrulama jetonu almasını sağlar.
ActionScript için AuthSub, JavaScript için AuthSub'ın bir varyantıdır. JavaScript için AuthSub gibi, istemci uygulamaların da Google dışı bir alanda barındırılan web sayfasından kimlik doğrulaması yapması için web alanları arası bir yöntem sağlar. Kimlik doğrulama hizmetinin farklı bir alan adında (www.google.com yerine accounts.googleapis.com) bulunması ve söz konusu alana harici sitelerden erişilmesini sağlayan bir crossdomain.xml
dosyası sağlaması, standart AuthSub'dan farklıdır.
Tüm Kimlik doğrulama hizmeti API'lerini kullanma hakkında görüşmek için Google Hesapları API Grubuna da bakın.
Kitle
Bu doküman, Google hizmetlerine erişen Flash veya Silverlight web uygulamaları geliştiren programcılar için hazırlanmıştır.
Bu dokümanda, Google Veri API'leri protokolü ve AuthSub arayüzünün arkasındaki genel fikirleri anladığınız varsayılmaktadır. Ayrıca, ActionScript'te nasıl programlama yapacağınızı bildiğiniz de varsayılır.
Desteklenen ortamlar
ActionScript için AuthSub şu anda Firefox 1.5 ve daha sonraki sürümlerde ve Internet Explorer 6.0 ve üzerinde, Flash 9.0 veya üzeri ya da Silverlight 2.0 veya üzeri sürümlerde desteklenmektedir.
AuthSub for ActionScript'in işleyiş şekli
Bir web uygulaması, Google Kimlik Doğrulama hizmeti ve Google Veri hizmeti arasındaki iletişimin işleyişine dair kısa bir özeti aşağıda bulabilirsiniz:
- Bir Google adına Google Veri hizmetine erişmek için web uygulamasının geçerli bir kimlik doğrulama jetonu olmalıdır. Genelde, uygulamalar bu jetonu bir çerezde depolar. Böyle bir çerez yoksa web uygulamasının, jetonu AuthSub üzerinden alması gerekir. Bir jeton almak için web uygulaması, Kimlik doğrulama hizmetine, erişilecek hizmeti belirterek AuthSub için bir AuthSub giriş çağrısı yapar.
- İsteğin web uygulamasından alınması durumunda kimlik doğrulama hizmeti, kullanıcıyı "Erişim İsteği" sayfasına yönlendirir. Bu sayfa, kullanıcıdan Google Hesabına giriş yapmasını ister ve Google hizmetine erişim izni vermesini veya reddetmesini ister.
- Web uygulamasına erişim izni verilip verilmeyeceğini kullanıcı belirler. Kullanıcı, erişimi reddederse web uygulamasına dönmek yerine bir Google sayfasına yönlendirilir.
- Kullanıcı başarılı bir şekilde giriş yapıp erişim izni verirse kimlik doğrulama hizmeti, kullanıcıyı orijinal çağrıyı yapan web uygulaması URL'sine yönlendirir. Yönlendirme, belirtilen sorgu için bir sorgu parametresi aracılığıyla kimlik doğrulama jetonu yayınlar. Uygulama, jetonu web tarayıcısının alan adında kullanıcının tarayıcısında bir çerez olarak depolamalıdır. Jeton iptal edilene kadar geçerlidir. (Jetonların ne zaman iptal edileceğine ilişkin öneri için Jetonlar hakkında bölümüne bakın.)
- Web uygulaması, Google Veri hizmetiyle iletişim kurar ve hizmete gönderilen her istekle birlikte kimlik doğrulama jetonunu gönderir.
- Jeton, Google Veri hizmeti tarafından tanınıyorsa istenen verileri sağlar.
ActionScript arayüzü için AuthSub'ı kullanma
ActionScript için AuthSub veya AuthSubAS, Google veri API'larını kullanan Flash (veya Silverlight) uygulamaları için web alanları arası AuthSub uç noktası sağlar.
AuthSubAS, google.com'da bulunan AuthSub uç noktalarının yansıtmasını sağlar ve Flash'ın (veya Silverlight'ın) bu uç noktalara erişmesine izin veren ek bir crossdomain.xml
dosyası içerir. Örneğin, AuthSubSessionToken uç noktası https://accounts.googleapis.com/accounts/AuthSubSessionToken erişimiyle kullanılabilir.
Aşağıdaki adımlarda, kimlik doğrulama jetonu alma ve bir Flash uygulamasından Google hizmetine erişmek için bu kodu kullanma süreci gösterilmektedir.
- Web alanları arası politikaları ayarlayın.
Flash'ı web alanları arası bir şekilde kullanmak için erişilecek her harici alan için bir politika ile başlatılması gerekir. Bunu yapmak üzere her alan için
Security.loadPolicyFile(policy)
ActionScript yöntemini çağırın. Örneğin:<?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) vephotos.googleapis.com/data
(örnekte daha sonra erişilecek olan PicasaWeb) için politikayı şu anda yüklüyoruz. - Tek kullanımlık jeton isteyin.
AuthSub sürecinin ilk adımı, AuthSub uç noktasından tek kullanımlık jeton istemektir. Uygulamanız bunu yapmak için
AuthSubRequest
uç noktasına bir çağrı çağırıp şunları yapmalıdır: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');
Bu yöntem bir kapsam değeri gerektirir. Her Google hizmeti, izin verdiği erişimin kapsamını tanımlar ve jeton isteğinde bu kapsama başvurmanız gerekir. Kullanılacak kapsam değerini belirlemek için erişmek istediğiniz Google hizmetiyle ilgili dokümanları kontrol edin. Kapsam bir URL'ye benzer; hizmeti tanımlayan basit bir URL olabilir veya erişimi salt okuma ile sınırlama gibi daha kısıtlı bir erişim gösterebilir. Hizmet, bir dizi kapsam sunduğunda, mümkün olan en dar kapsamlı jetonu isteyin. Örneğin, Google Takvim'in veri feed'lerine erişmek için
'http://www.google.com/calendar'
değil'http://www.google.com/calendar/feeds'
kapsamını kullanın.İpuçları:
- Kullanıcıdan giriş işlemini manuel olarak başlatmasını istemek için bir giriş düğmesi veya başka bir kullanıcı giriş mekanizması sağlamanızı önemle tavsiye ederiz. Bunun yerine, kullanıcının yüklemesini beklemeden yükleme yaptıktan hemen sonra kontrol edip yönlendirme yaparsanız kullanıcının sayfanızda ilk olarak Google giriş sayfası olduğunu görürsünüz. Kullanıcı giriş yapmamaya karar verirse Google onu sayfanıza geri yönlendirmez. Bu yüzden kullanıcı sayfayı ziyaret etmeyi denedi, ancak gönderilip hiçbir zaman geri gönderilmedi. Bu senaryo, kullanıcılar için kafa karıştırıcı ve can sıkıcı olabilir.
- Bir kullanıcı için birden fazla Google hizmetine erişmesi gereken uygulamalar (her hizmetin farklı bir kapsamı olduğundan) her yeni hizmet için yeni bir jeton istemelidir.
- Kimlik doğrulama jetonu isteyin.
AuthSubRequest
uç noktası, kullanıcının tarayıcısının URL'sinihttp://yourWebAppUrl?token=singleUseToken
olarak ayarlayarak uygulamanıza tek kullanımlık bir jeton döndürür. Uygulamanız tek kullanımlık jetonu aldıktan sonra, jetonu çok kullanımlı (uzun ömürlü) bir jeton ile değiştirmelidir. Bu jeton daha sonra Google Veri feed'lerine yönelik isteklerde bulunmak için kullanılabilir. Bunu yapmak için tek kullanım jetonuylaAuthSubSessionToken
yöntemini çağırın.Uygulamanız yüklendiğinde URL'deki
token
parametresini kontrol etmelidir: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 ... }Jeton bulunursa
getLongLivedToken
gibi bir yöntemi çağırmalıdır. Bu yöntemAuthSubSessionToken
uç noktasını çağırır: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
işleyici gibi bir yöntem, döndürülen jetonu kaydetmelidir: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); }
İpuçları:
- Uygulamanızın uzun süreli jetonu bir çerezde depolamasını ve bunları kısa süreli jeton kontrolünden önce kontrol etmesini kesinlikle öneririz. Böylece, kullanıcıların uygulamanızı kullanmak istedikleri her zaman AuthSub onay sayfasını ziyaret etmeleri engellenir.
- Kimlik doğrulama jetonu kullanma.
Kimlik doğrulama jetonunu kullanmak için jetonu bir Google hizmetine yapılan tüm isteklere
Authorization
üstbilgisi aracılığıyla ekleyin:Authorization: AuthSub token="(session token goes here)"
Fotoğraflar hizmeti için ActionScript'te örnek:
// 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, çıkış yapma düğmesi veya tıklanabilir bağlantı gibi manuel bir çıkış yapma özelliği sağlamanızı önerir. Bu yaklaşım sayesinde kullanıcılar diledikleri zaman çıkış yapabilir veya giriş yaptıktan sonra veri feed'lerini uygulamanıza bir sonraki erişimlerinde kullanabilir.
Jetonlar hakkında
Bu bölümde, AuthSub for ActionScript için kullanılan jetonlar açıklanmaktadır. Çoğu durumda, bu bilgiyi bilmeniz gerekmez.
Her bir kimlik doğrulama jetonu aşağıdaki verilere özeldir:
- Google hizmet kapsamı
- Kullanıcının Google hesabı
- İstemci uygulaması
Jeton verileri, yalnızca belirtilen üçüncü taraf uygulamasının veri isteğinde bulunabilmesini ve isteğin belirtilen kapsamdaki ve kullanıcı hesabındaki verilerle sınırlı olmasını sağlar.
Bu kapsam, kullanıcı ve istemci kombinasyonu için yalnızca bir jeton geçerli olabilir. Bir web uygulamasının, belirli bir kullanıcı için yeni bir Google hizmetine erişmesi gerektiğinde yeni bir jeton istemesi gerekir. Jeton kapsamındaki erişim, Google hizmetine bağlıdır ve bu hizmet, salt okuma erişimi gibi belirli veri türlerine veya etkinliklere erişimi sınırlamayı tercih edebilir.
AuthSub for ActionScript arayüzü tarafından döndürülen jeton, iptal edilene kadar gerektiği kadar kullanılabilir. Jetonun ömrünü yönetmek, güvenliği rahatlıkla dengelemek uygulamanıza bağlıdır. Google, her yeni oturum başlatıldığında yeni bir jeton istenmesini önerir.
Bazı Google hizmetleri yalnızca kayıtlı ve güvenli jetonlar kullanan web uygulamalarıyla erişime izin verebilir. ActionScript için AuthSub bu tür hizmetlerde desteklenmez. Güvenli jetonları kullanmak için kuruluşunuzun Google'a bir SSL sertifikası kaydettirmesi ve bu veri feed'lerine yönelik tüm istekleri imzalaması gerekir.