.perpetuummobile

...7 napon24 órás gondolkodás

Gadgetfejlesztés Rubyval: gadgeteer

OpenSocial gadget fejlesztésénél előfordulhat, hogy a kisalkalmazásunkból egy háttéralkalmazással kell kommunikálnunk. Erre nagyon jó módszereket nyújt a platform, és így az egész fejlesztési folyamat olyan lesz, mint egy jól megtámogatott AJAX intenzív webalkalmazás-fejlesztés. A backend oldalra a platform rugalmassága és a gyors fejlesztés miatt kiválóan alkalmas valamilyen rubys webframework. Az alábbiakban bemutatok pár eszközt, amit felhasználhatunk a backend fejlesztés során. Többek közt egy Virgos fejlesztésű Rails plugint is nyílttá teszünk, ami leegyszerűsít néhány dolgot.

Backend elérés

A backend oldallal való kommunikációra a gadgets.io.makeRequest függvény ad lehetőséget. Ez alapvetően egy proxyzott cross-domain ajax requestként működik, ahol kérhetjük azt is, hogy a kérés alá legyen írva. A nem aláírt esetben sok különlegességet ne várjunk szerver oldalon, szinte teljesen ugyanolyan, mint egy átlagos ajax request. Arra viszont érdemes figyelni, hogy a sessionkezelés nem fog működni utánajárás nélkül. Emiatt a Rails beépített CSRF védelme sem fog működni, de mint látni fogjuk, ez nem is probléma, hiszen a signed requestek megfelelő védelmet nyújtanak.

Aláírt lekérésre kétféle lehetőségünk van. Az egyik a signed request használata. Ebben az esetben a OpenSocial konténer a request paraméterekből egy privát kulcs vagy megosztott titok segítségével képez egy ellenőrző összeget. Ez alapján a távoli szerver tudni fogja, hogy valóban a várt helyről érkezik a kérés. Az aláírt paraméterek között szerepel az alkalmazás azonosító, és a viewer és az owner felhasználó azonosítója is. A lekérés a kulcs ismerete nélkül nem hamisítható, így biztosak lehetünk benne, hogy a kérést valóban az OpenSocial konténer küldte és a megadott adatok valódiak. Ebből már látható, hogy ez megfelelő CSRF védelmet nyújt, ezért ajánlatos minden nem GET requestnél a signed requestek használata.

A másik lehetőség az oauth használata, ahol az aláírás ugyanígy működik, de a request folyamat bonyolultabb, mert egy autentikációs lépést is tartalmaz. Ezt akkor érdemes használni, ha egy OpenSocial profilt össze akarunk kötni egy backend oldalon autentikációt igénylő saját felhasználónkkal. Erről a témáról bővebben majd egy későbbi bejegyzésben lesz szó.

Signed requestek ellenőrzése

A signed requestekről már volt szó az iWiW fejlesztői blogon, ott érdemes esetleg utánaolvasni a kliens oldali részleteknek. A fejlesztői blog bejegyzésének kommentjeiben előkerült egy rubys probléma is, ami a signed requestek ellenőrzésekor jön elő.

A signed requestek ellenőrzéséhez Rubyban az oauth gemre lesz szükség. A gem jelenlegi verziójában van egy bug, ami miatt a request paraméterek túl sokszor lesznek escape-elve az ellenőrző kód számításakor, és emiatt az ellenőrző kód hibás lesz. Hivatalos javítás még nincs, de már többen is megoldották a problémát a GitHubos forkokban. A javítás a gem általam forkolt verzióban is elérhető, és ez a verzió tartalmaz egy Rails Edge kompatibilitás fixet is. Ajánlom, hogy innen telepítsétek a gemet, amíg az új verzióval ki nem jön a hivatalos javítás. (Pull request ment, és úgy tűnik most kezd feléledni a fejlesztői lista, úgyhogy van remény.)

A githubról telepítéshez segédlet:
$ git clone git://github.com/lackac/oauth.git
$ cd oauth
$ rake gem
$ sudo gem install pkg/oauth-0.2.7.gem

Introducing gadgeteer

Az ellenőrzési folyamat és gadget backend fejlesztés megkönnyítésére házon belül készítettünk egy Rails plugint, ami igyekszik minél több terhet levenni a fejlesztő válláról. A plugin neve gadgeteer, és MIT licensz alatt elérhető a GitHub-on.

Telepítés:
$ script/plugin install git://github.com/virgo/gadgeteer.git

A plugin három dologban nyújt jelenleg segítséget. A kulcsokat teszi könnyen konfigurálhatóvá, a bejövő kérések ellenőrzését teszi egyszerűvé, és a konténertől kapott OpenSocial specifikus paramétereket teszi könnyen elérhetővé.

Kulcsok

A kulcsokat kétféleképpen lehet tárolni. A config könyvtár alatt, vagy valamelyik kontrollerben (célszerűen az ApplicationController-ben) konfigurálva.

Publikus kulcsok esetében a config/certs könyvtár alá kell berakni .cert kiterjesztésű fájlokat, vagy a kontrollerben a public_keys hash-be kell felvenni a megfelelő kulcsot a OpenSSL::PKey::RSA osztály egy példányaként. A gadgeteer a megfelelő kulcsot a xoauth_signature_publickey request paraméter alapján választja ki (iWiW esetében ennek értéke ‘iwiw.hu’).

Megosztott titok esetében a consumer_key/consumer_secret párosokat a config/oauth_secrets.yml fájlban lehet megadni, vagy közvetlenül a kontrollerben az oauth_secrets hash-be kell felvenni.

Ellenőrzés

A bejövő lekérések ellenőrzését a verify_signature metódussal végezhetjük. Ezt akár közvetlenül megadhatjuk egy before_filter-ben is. Az implementáció gondoskodik a megfelelő kulcs kiválasztásáról, és a megfelelő metódus segítségével ellenőrzi az aláírást.

OpenSocial paraméterek elérése

Signed request esetében kapunk pár hasznos paramétert, amiket a konténer ‘opensocial_’ előtaggal lát el. Ezeket persze el tudjuk érni a params metódus segítségével is, de a gadgeteer plugin ad erre egy kézenfekvőbb metódust, aminek open_social a neve. Így például a viewer azonosítója open_social[:viewer_id], az alkalmazás azonosítója pedig open_social[:app_id] lesz. Ezen túl bekerülnek még az ‘os_’ kezdetű paraméterek is, hogy lehetőség legyen a kliens oldal által további OpenSocial specifikus paramétereket is ide csoportosítani. (Például kliens oldalon lekérhetünk további adatokat a viewer-ről és továbbadhatjuk a backend-nek ‘os_viewer_*’ paraméterekben.)

A projekt README-ben található példakódok még világosabbá teszik a fentieket.

További tervek

A plugint szeretnénk tovább bővíteni hasznos dolgokkal, amelyek a kisalkalmazások fejlesztése közben előjönnek. Nyitottak vagyunk további javaslatok felé is, de nem ígérhetjük, hogy minden felmerülő ötletet megvalósítunk. Örömmel fogadjuk viszont, ha GitHubon keresztül küldtök pull requestet azokról a dolgokról, amelyekkel ti bővítitek a plugint.


  1. Nincs hozzászólás