Plaid segítségével felhatalmazza a fintech tér újítóit azáltal, hogy egységes API-n keresztül hozzáférést biztosít számukra a pénzügyi adatokhoz. Annak érdekében, hogy a végfelhasználók összekapcsolják banki adataikat a fintech alkalmazásokkal, a Plaid kifejlesztett egy linket, egy drop-in modult, amely kezeli a hitelesítő adatok érvényesítését, a többtényezős hitelesítést és a hibakezelést minden támogatott bank számára.
az Android fejlesztőknek korábban meg kellett nyitniuk a Link URL-eket a Webnézetekben. Minden alkalmazás, amely használni akarta a linket, sok fejlesztői erőfeszítést igényelt, és szabványosítás nélkül bizonyos implementációkban hiba volt. A fejlesztői élmény javítása érdekében nemrégiben kiadtunk egy SDK-t, amely megkönnyíti a WebView integrálását bármely alkalmazásba, néhány sornyi kóddal.
ezenkívül a Webnézetek nem teljesen biztonságosak a végfelhasználók számára, akik érzékeny információkat visznek be a Linkfolyamatba. Annak érdekében, hogy az SDK-t a lehető legbiztonságosabbá tegyük, az Android WebViews helyett a Chrome Egyéni lapjaival valósítottuk meg. Ebben a cikkben elmagyarázzuk, miért hoztuk meg ezt a döntést, és hogyan oldottuk meg az út során felmerült technikai problémákat.
opcióink kiértékelése
SDK-ként a kódunk más fejlesztők alkalmazásaiban fut, és cserébe azok alkalmazási folyamataiban. A Link webalkalmazás WebView-ban történő futtatásához engedélyezni kell a Javascriptet. Ez megnyitja az ajtót más alkalmazások számára rosszindulatú kódok futtatásához, például visszahívások regisztrálásához, amelyek megpróbálják elfogni a felhasználóneveket és a jelszavakat. Ezenkívül egy rosszindulatú alkalmazás megnyithat egy másik weboldalt, amely adathalász kísérlet során utánozza a Linkfolyamatot.
amikor olyan megoldást kerestünk, amely könnyen integrálható a fejlesztők számára, intuitív a végfelhasználók számára és biztonságos, számos lehetőséget értékeltünk:
-
natív linkfolyamat létrehozása: mivel a natív Linkfolyamatok egy másik alkalmazás folyamatában is futnának, a hozzáértő fejlesztők a reflection segítségével megtalálhatják a bemeneti EditText-eket, és a WebView-ban a Javascript-hez hasonló módon regisztrálhatják a visszahívásokat.
-
külön hitelesítő alkalmazás létrehozása: Ez natív sandboxos élményt nyújtana, és ideális élmény lenne a végfelhasználók számára; azonban sok felhasználó nem szeretne letölteni egy extra alkalmazást a Play Áruházból. Ez azt jelenti, hogy tartalék megoldásra lenne szükségünk azoknak a felhasználóknak, akik megtagadják az alkalmazás letöltését.
-
link megnyitása külön böngészőablakban: ez egy sandboxos, biztonságos megoldás lenne. Szinte minden felhasználó rendelkezik böngészővel, de az alkalmazásról a böngészőre való váltás észrevehető késést okozna, különösen az alacsony kategóriájú eszközökön.
-
a Chrome Egyéni lapjainak használata: Ezt a megoldást választottuk, mivel a fent említett hátrányok egyike sem volt.
választásunk: Chrome Custom Tabs
a Chrome custom tabs (CCT) a Chrome böngésző része, amely integrálódik az Android keretrendszerrel, hogy az alkalmazások könnyű folyamatban nyissák meg a webhelyeket. A CCT gyorsabban nyílik meg, mint egy böngésző, és ha a bemelegítő híváson keresztül előre betöltődik, potenciálisan még gyorsabb, mint egy WebView. Bár továbbra is Javascript-et futtat, a saját folyamatában van, amely megakadályozza az alkalmazások rosszindulatú kód futtatását. Ezenkívül a CCT felhasználói felület tartalmaz egy műveletsávot, amely megmutatja a betöltött oldal URL-jét, valamint a biztonságos oldalak SSL-ellenőrző zár ikonját. Ez megnyugtatja a felhasználókat, hogy a megfelelő oldal jelenik meg.
bár nem minden felhasználó telepítette a Chrome-ot, a túlnyomó többség igen. Azok számára, akik nem, a fent leírt böngésző tartalék módszert használjuk (3.lehetőség); egy kódsor hozzáadása mellett ingyenesen megkapjuk a tartalékot a CCT-től. Mint korábban megjegyeztük, a böngésző tartalék késése miatt nem ideális felhasználói élmény, de fenntartja a Plaid által megkövetelt magas szintű biztonságot.
a CCT megoldás kifejlesztése során számos komplikációba ütköztünk és kezeltünk:
-
eseményadatok beszerzése
-
a végeredmény lekérése
-
a CCT tevékenység ellenőrzése & folyamat
eseményadatok lekérése
amikor egy felhasználó a Link képernyői között navigál, átirányítás történik, és az adatok az URL-paraméterekben kerülnek a fejlesztők rendelkezésére.
ez az átirányítási információ értékes a fejlesztők számára, mivel segít megérteni a felhasználói viselkedést. Mivel a CCT a saját folyamatában fut, és nem nyújt átirányítási visszahívást, ezek az információk általában nem érhetők el, ami a biztonságos SDK-t kevésbé működőképessé tenné a fejlesztők számára, mint az egyedi WebView-implementációik.
hogy ezeket az információkat a CCT-től biztosítsuk, ehelyett az átirányítási eseményeket rögzítettük a kiszolgálón egy Redis adattárban. Amikor az SDK megnyitja a linket, bootstrap hívást kezdeményez a szervereinkre, amelyek megadják az általunk választott felhasználónkénti csatorna azonosítót és egy titkos kulcsot. Az SDK ezután létrehoz egy alkalmazás hatókörűmunkaobjektumot, amely RX intervallumfolyam segítségével lekérdezi a kiszolgálót. Minden lekérdezési hívásnál megadjuk a szervernek a csatorna azonosítóját, a titkos kulcsot és az utolsó esemény UUID-jét (vagy null), hogy megkapja a legfrissebb eseményeket.
megfigyelhető.intervallum (intervallum, időegység.Másodperc).subscribeOn (ütemezők.számítás()).observeOn (AndroidSchedulers.mainThread()).flatMapSingle (makeNetworkCall()).feliratkozás({// üzenetek kezelése},{// hibák kezelése})
az Android keretrendszer megölhet bármilyen folyamatot, beleértve a Plaid SDK-ját használó alkalmazást is. Mivel a munkavállaló objektum az alkalmazáshoz van kötve, ez a munkavállaló leállítását eredményezné. Ha a felhasználó folytatja a folyamatot, (sikeresen vagy sikertelenül) az SDK utolsó hívást kezdeményez a csatornára, és megkapja a fennmaradó eseményeket. Az események csak akkor vesznek el, ha a felhasználó megszakítja az áramlást, és az erő megöli az alkalmazást.
a végeredmény lekérése
az eseményadatok klienseknek történő továbbításához hasonlóan a Link az URL-t használja annak jelzésére, hogy a felhasználó befejezte a folyamatot. A vonatkozó URL tartalmazza a szükséges adatokat, például a nyilvános kulcsot vagy a hibakódot.
mivel nem tudjuk elérni az URL-t CCT-vel, a végeredményt Redis-ben tároltuk ugyanazzal a csatornaazonosítóval. Bár ez azt jelenti, hogy a közvélemény-kutató munkatársunk tudná, mikor fejeződött be a Link, nem lenne garancia arra, hogy a munkavállaló még mindig életben lesz. Még ha életben is lenne, előfordulhat, hogy a felhasználónak meg kell várnia a következő lekérdezési hívásig az eredmény kézbesítését, ami hosszú pár másodperc lehet.
az eredmény időben történő kézbesítésének biztosítása érdekében mély linket használunk az SDK újbóli megnyitásához. A mély link az alkalmazás alkalmazásazonosítójával jön létre, amelyet társítani kell az ügyfél titkához, és engedélyezőlistára kell tenni a fejlesztői irányítópulton. Ez, valamint az a tény, hogy egy eszközön csak egy alkalmazásnak lehet ugyanaz az alkalmazásazonosítója, biztosítja, hogy más alkalmazások ne fogják el az átirányítást. A Link webalkalmazás ezután létrehoz egy szándékú URI-t, amelyet a Linkfolyamat végén indítanak el.
szándék: / / átirányítás/ # szándék; séma=kockás; csomag=$Csomagnév; vége;
az SDK tartalmaz egy intent szűrőt az URI kezelésére, így az alkalmazás újra megnyílik, és azonnal hívást kezdeményez közvetlenül a csatornára.
<intent-filter><action android: name= " android.szándék.felvétel.Nézet" /><kategória android: name= " android.szándék.kategória.Alapértelmezett" /><kategória android: name= " android.szándék.kategória.Böngészhető" /><adatokandroid:host= "átirányítás"android:rendszer= "kockás" /></intent-filter>
Controlling CCT
CCT hiányzik interfészek az alkalmazás:
-
hallgassa meg, amikor a felhasználó bezárja a tevékenységet
-
észleli, ha a felhasználó rákattintott a “Megnyitás a böngészőben” opcióra
-
kényszeríteni, hogy zárja be
sikeresen megoldottuk ezeket a hiányosságokat.
először is, hogy meghallgassuk, amikor a felhasználó bezárja a tevékenységet, megnyitjuk a CCT-t a startActivityForResult használatával, és átadunk egy kérési kódot. Ha a felhasználó bezárja a CCT-t a system back gomb bal felső sarkában található X segítségével, akkor az onActivityResult visszahívás az általunk megadott kérési kóddal és a tevékenység eredménykódjával indul.RESULT_CANCELED. Az adatok szándék nem tartalmaz semmilyen információt, de tudjuk, hogy egy utolsó hívást a csatorna, hogy a fennmaradó események. Ezután átadjuk őket az ügyfélalkalmazásnak, és visszaadunk egy LinkCancellation objektumot, jelezve, hogy a linket a Felhasználó szándékosan zárta le.
ezután a potenciális aggodalomra ad okot annak észlelése, amikor a felhasználó rákattintott a “Megnyitás a böngészőben” gombra, az, hogy a felhasználó ezután egy külön alkalmazásban, nevezetesen a böngészőben átmehet a teljes folyamaton. Ez számunkra nem jelent problémát, mert a közvélemény-kutatás és a szándékrendszer továbbra is ugyanúgy működik, és még mindig megkaphatjuk a szükséges adatokat.
végül, amikor a Felhasználó sikeresen befejezi a folyamatot, és az eredménykoncepció elindul, a CCT folyamat nyitva marad, és a felhasználó feladatlistájában marad. Ez a fantom folyamat nemcsak pazarló lenne, hanem zavaró is lehet A felhasználó számára, amikor megnyomja a “legutóbbi feladatok” rendszergombot. Ezért szükségünk van arra, hogy kényszerítsük a CCT bezárását, amikor az áramlás befejeződött.
ehhez az OpenId AppAuth for Android könyvtárban látható mintát használtuk. Ahelyett, hogy az eredményt a linket megnyitó tevékenységben kezelnénk, a szándékszűrőt külön tevékenységre helyezzük. Ez a második tevékenység kezeli az összes átirányítást a webalkalmazásból, amelyek a következők: sikeres befejezések, az áramlást lezáró hibák, oAuth vagy App-to-App átirányítások és általános rendszerhibák. A tevékenység ezután átadja az adatokat a nyitó tevékenységnek egy szándék használatával a szándékkal.FLAG_ACTIVITY_SINGLE_TOP és Intent.FLAG_ACTIVITY_CLEAR_TOP zászlók. Együtt használva mindent megtisztítanak a kötegen a nyitó tevékenység felett, beleértve a CCT-t is.
val intent = Intent (tevékenység, LinkActivity:: osztály.java)amikor (állapot) {átirányításra kerül.ChromeCustomTabsComplete -> {szándék.putExtra (LINK_CHROME_CUSTOM_TABS_COMPLETE_REDIRECT, igaz)szándék.putExtra(LINK_RESULT_CODE, state.resultCode)intent.putExtra(LINK_RESULT, state.result)}is RedirectState.UserInitiatedChromeCustomTabsViewClose -> {intent.putExtra(LINK_CHROME_CUSTOM_TABS_USER_CLOSE_REDIRECT, true)}is RedirectState.OAuth -> {intent.putExtra(LINK_OAUTH_REDIRECT, true)intent.putExtra(LINK_OAUTH_STATE_ID, state.oauthStateId)}is RedirectState.RedirectError ->intent.putExtra (LINK_REDIRECT_ERROR, igaz)}szándék.flags = szándék.FLAG_ACTIVITY_SINGLE_TOP vagy szándék.FLAG_ACTIVITY_CLEAR_TOPvisszatérési szándék
záró gondolatok a CCT-ről
annak érdekében, hogy biztonságos, homokozós élményt nyújtson, amely nem érhető el a WebView-kben vagy a natív folyamatokban, a CCT életképes megoldás. Könnyen integrálható a fejlesztők számára, és jobb felhasználói élményt nyújt, mint a böngészőablakok megnyitása a könnyű természetének és sebességének köszönhetően.
a CCT sandboxos jellege és korlátozott API-ja azt jelenti, hogy nincs hátránya. Az URL-átirányítások meghallgatása, a végső eredmények elérése és a CCT-folyamat ellenőrzése mind megkövetelte tőlünk, hogy kreatív megoldásokkal álljunk elő. Ezek a megoldások az Android beépített funkcióinak, különösen az intent keretrendszer megértésére támaszkodtak.
a fejlesztők és a fogyasztók számára nyújtott előnyök megérte a szükséges erőfeszítést, és javasoljuk a CCT használatát más alkalmazásokban és SDK-kban a gyors és biztonságos integráció érdekében. Ezenkívül az itt megadott tippeket felhasználhatja a felhasználói (és fejlesztői) élmény javítására.
ha olyan egyedi problémák megoldása érdekli, amelyeket Fejlesztők ezrei és fogyasztók milliói fognak használni, látogasson el Karrier oldalunkra.