ActionScript'te AuthSub'ı kullanma

Bu belgede, Google'ın AuthSub kimlik doğrulama sisteminin Flash veya Silverlight uygulamasından nasıl kullanılacağı açıklanmaktadır.

Not: Google'ın web tabanlı uygulamalar için hesap kimlik doğrulama hizmeti olan AuthSub'ı zaten biliyorsanız ActionScript için AuthSub'ın kavramsal olarak çok benzer olduğunu göreceksiniz. Temel uygulama farklıdır ancak bu farklılıklar, istemci uygulaması geliştiricisi olarak sizin için önemli değildir. Bazı belgelerde, ayrımın önemsiz olduğu bağlamlarda ActionScript için AuthSub'a kısaca "AuthSub" olarak atıfta bulunuyoruz.

ActionScript için AuthSub arayüzü, Flash veya Silverlight uygulamalarının bir kullanıcı adına korumalı Google Data API feed'lerinde kimlik doğrulaması yapmasına olanak tanır. Arayüz, yüksek düzeyde güvenlik sağlamak için uygulamanın kullanıcının hesap giriş bilgilerini hiçbir zaman işlememesine rağmen kimlik doğrulama jetonu almasına olanak tanır.

ActionScript için AuthSub, JavaScript için AuthSub'ın bir varyantıdır. JavaScript için AuthSub gibi, istemci uygulamalarının Google dışı bir alan adında barındırılan bir web sayfasından kimlik doğrulaması yapması için alanlar arası bir yöntem sağlar. Kimlik doğrulama hizmetinin farklı bir alanda (www.google.com yerine accounts.googleapis.com) bulunması ve bu alana harici sitelerden erişime izin veren bir crossdomain.xml dosyası sağlaması nedeniyle standart AuthSub'dan farklıdır.

Tüm kimlik doğrulama hizmeti API'lerinin kullanımıyla ilgili tartışma için Google Hesapları API Grubu'na da bakın.

Kitle

Bu belge, Google hizmetlerine erişen Flash veya Silverlight web uygulamaları geliştiren programcılar için hazırlanmıştır.

Bu belgede, Google Veri API'leri protokolü ve AuthSub arayüzü ile ilgili genel fikirleri anladığınız varsayılır. Ayrıca ActionScript ile programlama yapmayı bildiğiniz de varsayılır.

Desteklenen ortamlar

ActionScript için AuthSub şu anda Firefox 1.5 ve sonraki sürümlerinde, Internet Explorer 6.0 ve sonraki sürümlerinde, Flash 9.0 veya sonraki sürümlerinde ya da Silverlight 2.0 veya sonraki sürümlerinde desteklenmektedir.

ActionScript için AuthSub'ın işleyiş şekli

Bir web uygulaması, Google kimlik doğrulama hizmeti ve bir Google veri hizmeti arasındaki iletişimin nasıl çalıştığına dair kısa bir özeti aşağıda bulabilirsiniz:

  1. Bir kullanıcının adına Google Veri Hizmeti'ne erişmek için web uygulamasının geçerli bir kimlik doğrulama jetonu olması gerekir. Uygulamalar genellikle bu jetonu bir çerezde saklar. Böyle bir çerez yoksa web uygulaması, jetonu AuthSub aracılığıyla edinmelidir. Web uygulaması, jeton almak için kimlik doğrulama hizmetine erişilecek hizmeti belirterek ActionScript için bir AuthSub oturum açma çağrısı yapar.
  2. Kimlik doğrulama hizmeti, web uygulamasından isteği aldıktan sonra kullanıcıyı "Erişim İsteği" sayfasına yönlendirir. Bu sayfada kullanıcıdan Google Hesabı'na giriş yapması ve Google hizmetine erişim izni vermesi veya erişimi reddetmesi istenir.
  3. Kullanıcı, web uygulamasına erişim izni verip vermeyeceğine karar verir. Kullanıcı erişimi reddederse web uygulamasına geri yönlendirilmek yerine bir Google sayfasına yönlendirilir.
  4. 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 geri yönlendirir. Yönlendirme, sorgu parametresi aracılığıyla belirtilen hizmet için bir kimlik doğrulama jetonu sağlar. Uygulama, jetonu kullanıcının tarayıcısında, web uygulamasının alan adı altında çerez olarak saklamalıdır. Jeton, iptal edilene kadar geçerlidir. (Jetonları ne zaman iptal edeceğinizle ilgili öneriler için Jetonlar hakkında bölümüne bakın.)
  5. Web uygulaması, Google Veri Hizmeti ile iletişime geçer ve hizmete gönderilen her istekle birlikte kimlik doğrulama jetonunu gönderir.
  6. Google Veri Hizmeti, jetonu tanırsa istenen verileri sağlar.

ActionScript için AuthSub arayüzünü kullanma

ActionScript için AuthSub veya AuthSubAS, Google Veri API'lerini kullanan Flash (veya Silverlight) uygulamaları için alanlar arası bir AuthSub uç noktası sağlar.

AuthSubAS, google.com'da bulunan AuthSub uç noktalarının bir yansımasını sağlar. Ayrıca, Flash'in (veya Silverlight'ın) bu uç noktalara erişmesine olanak tanıyan ek bir crossdomain.xml dosyası içerir. Örneğin, AuthSubSessionToken uç noktası https://accounts.googleapis.com/accounts/AuthSubSessionToken adresine erişilerek kullanılabilir.

Aşağıdaki adımlar, kimlik doğrulama jetonu alma ve bunu Flash uygulamasından bir Google hizmetine erişmek için kullanma sürecini açıklar.

  1. Alanlar arası politikaları ayarlayın.

    Flash'ın alanlar arası şekilde kullanılabilmesi için erişilecek her harici alan adı için bir politika ile başlatılması gerekir. Bunu yapmak için her alan adı için Security.loadPolicyFile(policy) ActionScript yöntemini aşağıdaki gibi çağırın:

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

    Tam örneği görüntüle

    Burada accounts.googleapis.com (AuthSubAS) ve photos.googleapis.com/data (örnekte daha sonra erişilen PicasaWeb) için politikayı yüklediğimizi unutmayın.

  2. Tek kullanımlık jeton isteyin.

    AuthSub sürecindeki ilk adım, AuthSub uç noktasından tek kullanımlık bir jeton istemektir. Uygulamanız, AuthSubRequest uç noktasına aşağıdaki gibi bir çağrı yaparak bunu 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');

    Tam örneği görüntüle

    Bu yöntem için bir kapsam değeri gerekir. Her Google hizmeti, izin verdiği erişimin kapsamını tanımlar ve jeton isteğinde bu kapsamı referans olarak belirtmeniz gerekir. Hangi kapsam değerinin kullanılacağını belirlemek için erişmek istediğiniz Google hizmetinin dokümanlarını inceleyin. Kapsam, bir URL'ye benzer. Hizmeti tanımlayan basit bir URL olabilir veya salt okuma erişimi gibi daha kısıtlı bir erişim belirtebilir. Hizmet, kapsam seçimi sunuyorsa 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 oturum açma sürecini manuel olarak başlatmasını istemek için bir giriş düğmesi veya başka bir kullanıcı girişi mekanizması sağlamanızı önemle tavsiye ederiz. Bunun yerine, yükleme işleminden sonra kullanıcı etkileşimi beklenmeden hemen kontrol edip yönlendirme yaparsanız kullanıcı, sayfanıza geldiğinde ilk olarak Google giriş sayfasını görür. Kullanıcı oturum açmamaya karar verirse Google, kullanıcıyı sayfanıza geri yönlendirmez. Bu nedenle, kullanıcı açısından bakıldığında, sayfanızı ziyaret etmeye çalışmış ancak gönderilmiş ve geri gönderilmemiştir. Bu senaryo, kullanıcılar için kafa karıştırıcı ve sinir bozucu olabilir.
    • Bir kullanıcı için birden fazla Google hizmetine erişmesi gereken uygulamalar, her yeni hizmet için yeni bir jeton istemelidir (çünkü her hizmetin farklı bir kapsamı vardır).

  3. Kimlik doğrulama jetonu isteyin.

    AuthSubRequest uç noktası, kullanıcının tarayıcısının URL'sini http://yourWebAppUrl?token=singleUseToken olarak ayarlayarak uygulamanıza tek kullanımlık bir jeton döndürür. Uygulamanız tek kullanımlık jetonunu aldıktan sonra bu jetonu, Google veri feed'lerine karşı istekte bulunmak için kullanılabilecek çok kullanımlık (uzun ömürlü) bir jetonla değiştirmelidir. Bunu yapmak için tek kullanımlık jetonla AuthSubSessionToken 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 ... }

    Tam örneği görüntüle

    Jeton bulunursa getLongLivedToken gibi bir yöntem çağrılmalıdır. Bu yöntem, AuthSubSessionToken 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);
          }

    Tam örneği görüntüle

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

    Tam örneği görüntüle

    İpuçları:

    • Uygulamanızın uzun süreli jetonu bir çerezde saklamasını ve kısa süreli jeton kontrolünden önce bunları kontrol etmesini kesinlikle öneririz. Bu sayede kullanıcılar, uygulamanızı her kullanmak istediklerinde AuthSub onay sayfasını ziyaret etmek zorunda kalmaz.

  4. Kimlik doğrulama jetonu kullanma.

    Kimlik doğrulama jetonunu kullanmak için 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'teki ö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'));

    Tam örneği görüntüle

  5. Google, oturumu kapatma düğmesi veya tıklanabilir bağlantı gibi manuel oturumu kapatma özelliği sunmanızı önerir. Bu yaklaşım, kullanıcılara istedikleri zaman oturumu kapatma veya oturumlarını açık tutarak veri feed'lerini uygulamanıza bir sonraki erişimlerinde kolayca kullanma seçeneği sunar.

Jetonlar hakkında

Bu bölümde, AuthSub tarafından ActionScript için kullanılan jetonlar açıklanmaktadır. Çoğu durumda bu bilgiyi bilmeniz gerekmez.

Her 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 herhangi bir zamanda yalnızca bir jeton geçerli olabilir. Bir web uygulaması, belirli bir kullanıcı için yeni bir Google hizmetine erişmesi gerektiğinde her seferinde yeni bir jeton istemelidir. Jetonun kapsadığı erişim kapsamı, Google hizmetine bağlıdır. Google hizmeti, salt okunur erişim gibi belirli veri veya etkinlik türlerine erişimi sınırlamayı seçebilir.

AuthSub tarafından ActionScript arayüzü için döndürülen jeton, iptal edilene kadar gerektiği kadar kullanılabilir. Güvenlik ile kolaylık arasında denge kurarak jetonun ömrünü yönetmek uygulamanıza bağlıdır. Google, yeni bir oturum her başlatıldığında yeni bir jeton isteğinde bulunmanızı önerir.

Bazı Google hizmetleri, yalnızca kayıtlı ve güvenli jetonlar kullanan web uygulamaları tarafından 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ı kaydetmesi ve bu veri feed'leri için tüm istekleri imzalaması gerekir.

Başa dön