Jun 19, 2009

Google AuthSub a Picasa Web Data API crossdomain.xml

Je viac ako rok potom, kedy do gdata-issues pribudla žiadosť o pridanie crossdomain.xml pre Google Accounts (http://code.google.com/p/gdata-issues/issues/detail?id=406).

Od apríla tohto roku som mal možnosť ako člen http://groups.google.com/group/authsub-trusted-testers skupiny testovať a ladiť AuthSub autentifikáciu cez Flash Player. Mesiac sme komunikovali, testovali a reportovali problémy. Výsledkom je crossdomain.xml pre Google Accounts http://accounts.googleapis.com/crossdomain.xml

Juch. Zhrniem výsledky do krátkej ukážky Google Accounts AuthSub autentifikácie:

1. Načítať crossdomain.xml

Explicitne musíme povoliť odosielanie requestov na Google Accounts API Security.loadPolicyFile("https://accounts.googleapis.com/crossdomain.xml");

2. Prejsť na stránku “Žiadosť o prístup”

Nasleduje autentifikácia cez prehliadač na strane Google

// create a request to get the token
var variables : URLVariables = new URLVariables();
    variables["scope"] = "http://photos.googleapis.com/data";
    variables["session"] = "1";
    variables["secure"] = "0";
    variables["hd"] = "default";
    variables["next"] = "http://www.prasa.sk/authsub/index.html";

var request: URLRequest = new URLRequest("https://www.google.com/accounts/AuthSubRequest");
    request.data =  variables;

navigateToURL(request, "_top");

3. Google vráti prehliadač späť …

… na našu aplikáciu spolu aj s tokenom. Token sa dá z adresy načítať napríklad cez ExternalInterface.call() http://www.prasa.sk/authsub/index.html?token=CK-...-ezGBg

4. Načítať long-lived session token

Nasledovným volaním vymeníme single-use token za long-lived session token, ktorý možeme použiť na authorizovaný request služieb Google (napr. Picasa Web Data API):

private function getAuthSubSessionToken() : void
{
    // create request to get the session token
    var request : URLRequest = new URLRequest();
        request.url = "https://accounts.googleapis.com/accounts/AuthSubSessionToken";
        request.method = URLRequestMethod.POST;            // we need to use POST method because the headers are NOT sent
        request.data = new URLVariables("test=variable");    // some test varialbe to get the headers working
        // create request headers
        request.requestHeaders.push(new URLRequestHeader("Authorization","AuthSub token=\""+token+"\""));
        request.requestHeaders.push(new URLRequestHeader("Content-type","application/x-www-form-urlencoded"));

    var loader : URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, loader_result);

    try
    {
        loader.load(request);
    } 
    catch(e : Error)
    {
        throw new Error(e);
    }
}

public function loader_result(evt : Event) : void
{
    var loader : URLLoader = URLLoader(evt.target);
    sessionToken = new URLVariables(loader.data).Token; // store our session token in a instance variable
}

Novinkou v crossdomain.xml aktualizáciách od Google je aj Picasa Web Data API. Do crossdomain.xml súboru pribudla Authorization hlavička a keďže vlastné hlavičky sa nedajú z Flash Player-a poslať ináč ako POST requestom, pribudla aj X-HTTP-Method-Override hlavička pre simuláciu napr. GET requestov. S takýmto crossdomain.xml súborom a long-lived session tokenom už konečne vieme načítať napríklad zoznam privátnych Picasa Web albumov.

1. Explicitne načítať crossdomain.xml

Explicitne musíme povoliť odosielanie requestov na Picasa Web Data API Security.loadPolicyFile("http://photos.googleapis.com/data/crossdomain.xml");

2. Odoslať žiadosť …

… spolu s autorizačným tokenom v hlavičke

private function getPrivateAlbums() : void
{
    // create request to get the session token
    var request : URLRequest = new URLRequest();
        request.url = "http://photos.googleapis.com/data/feed/api/user/default?access=private";
        request.method = URLRequestMethod.POST;            // we need to use POST method because the headers are NOT sent
        request.data = new URLVariables("test=variable");    // some test varialbe to get the headers working
        // create request headers
        request.requestHeaders.push(new URLRequestHeader("Authorization","AuthSub token=\"" + sessionToken + "\""));
        request.requestHeaders.push(new URLRequestHeader("X-HTTP-Method-Override", "GET"));
        request.requestHeaders.push(new URLRequestHeader("Content-type","application/atom+xml"));

    var loader : URLLoader = new URLLoader();
        loader.addEventListener(Event.COMPLETE, privateLoader_result);

    try
    {
        loader.load(request);
    } 
    catch(e : Error)
    {
        throw new Error(e);
    }
}

public function privateLoader_result(evt : Event) : void
{
    var atom_ns : Namespace = new Namespace("http://www.w3.org/2005/Atom");
    var loader : URLLoader = URLLoader(evt.target); 
    var data : XML = new XML(loader.data);

    for each(var album : XML in data.atom_ns::entry)
    {
        trace(album.atom_ns::title.text(), album.atom_ns::summary.text());
    }        
}

Funkčnú aplikáciu hladajte na http://www.prasa.sk/authsub (view-source enabled).

Po dlhom čase sme sa nakoniec dočkali. Som zvedavý na nové aplikácie a možnosti. Má niekto chuť napísať gdata client library v as3?

Blog comments powered by Disqus

About
Subscribe via RSS.