zabezpečení WebViews pomocí Chrome Custom Tabs

Plaid umožňuje inovátorům ve fintech prostoru tím, že jim poskytuje přístup k finančním datům prostřednictvím jednotného API. S cílem pomoci koncovým uživatelům připojit své bankovní údaje fintech aplikací, Kostkované vyvinutý Odkaz, drop-in modul, který zpracovává pověření ověřování, ověřování multi-faktor a zpracování chyb pro každé podporované banky.

vývojáři Androidu dříve museli otevřít adresy URL odkazů ve WebViews. Každá aplikace, která chtěla používat Link, vyžadovala hodně úsilí vývojářů a bez standardizace se v některých implementacích musely vyskytnout chyby. V zájmu zlepšení vývojka zkušenosti, nedávno jsme vydali SDK takže WebView snadno integrovat do libovolné aplikace s jen pár řádků kódu.

Navíc, WebViews, nejsou zcela bezpečné pro koncové uživatele, kteří vstup citlivé informace do Odkazu toku. Aby byla naše SDK co nejbezpečnější, implementovali jsme ji pomocí vlastních karet Chrome místo webviews Android. V tomto článku vysvětlíme, proč jsme se rozhodli a jak jsme překonali technické problémy, se kterými jsme se na cestě setkali.

vyhodnocování našich možností

jako SDK, náš kód běží v aplikacích jiných vývojářů a následně v jejich aplikačních procesech. Chcete-li spustit webovou aplikaci Link ve WebView, musí být povolen Javascript. Tím se otevírají dveře pro další aplikace ke spuštění škodlivého kódu, například registrace zpětných volání, která se snaží zachytit uživatelská jména a hesla. Kromě toho by škodlivá aplikace mohla otevřít další webovou stránku, která napodobuje tok odkazů při pokusu o phishing.

Když hledáme řešení, které je snadné integrovat s pro vývojáře, intuitivní pro koncové uživatele, a bezpečné, jsme hodnotili několik možností:

  1. budování nativní odkaz tok: Protože nativní Odkaz toků by také spustit v jiném app je proces, důvtipný vývojáři mohli používat odraz najít naše vstupní EditTexts a registraci zpětná volání způsobem, který je podobný Javascriptu v WebView.

  2. vytvoření samostatné autentizační aplikace: To by poskytlo nativní sandboxed zážitek a byl by ideální zážitek pro koncové uživatele; mnoho uživatelů by však nechtělo stahovat další aplikaci z Obchodu Play. To znamená, že bychom potřebovali záložní řešení pro uživatele, kteří odmítnou stáhnout aplikaci.

  3. otevření odkazu v samostatném okně prohlížeče: toto by bylo bezpečné řešení v karanténě. Téměř všichni uživatelé mají nainstalovaný prohlížeč, ale kontext přepínání z aplikace do prohlížeče by se zavést znatelné zpoždění, hlavně na low-end zařízení.

  4. používání vlastních karet Chrome: Toto je řešení, které jsme zvolili, protože nemělo žádnou z výše uvedených nevýhod.

Naše Volba: Chrome Vlastní Karty

Chrome vlastní karty (CCT) je součástí prohlížeče Chrome, která integruje s Android rámce, aby aplikace otevřené webové stránky v lehkém procesu. CCT se otevírá rychleji než prohlížeč a, pokud je předem načten pomocí zahřívacího hovoru, je potenciálně ještě rychlejší než WebView. I když stále běží Javascript, je ve svém vlastním procesu, který zabraňuje aplikacím spouštět škodlivý kód. Uživatelské rozhraní CCT navíc poskytuje panel akcí, který zobrazuje adresu URL načtené stránky, spolu s ikonou zámku ověření SSL pro zabezpečené stránky. To ujišťuje uživatele, že se zobrazuje správná stránka.

alt

i když ne všichni uživatelé mají nainstalován Chrome, drtivá většina Ano. Pro ty, kteří tak neučiní, používáme výše popsanou metodu fallback prohlížeče (možnost 3); kromě přidání jednoho řádku kódu získáme fallback zdarma od CCT. Jak již bylo uvedeno výše, fallback prohlížeče není díky své latenci ideálním uživatelským zážitkem, ale udržuje vysokou úroveň zabezpečení, kterou Plaid vyžaduje.

Tak jsme vyvinuli CCT řešení, které jsme narazili a řešit několik komplikací:

  • Získání dat o událostech

  • Načítání konečný výsledek

  • Ovládání CCT aktivity & proces

Získání Dat o událostech

, Když uživatel naviguje mezi obrazovkami v Odkaz, dojde k přesměrování a dat je k dispozici pro vývojáře v URL parametry.

alt

tato informace o přesměrování je pro vývojáře cenná, protože jim pomáhá porozumět chování uživatelů. S CCT běží ve vlastním procesu, a ne poskytování přesměrování, zpětné volání, tato informace by normálně nepřístupné, které by naše bezpečné SDK méně funkční pro vývojáře, než je jejich vlastní implementace WebView.

abychom poskytli tyto informace z CCT, místo toho jsme zaznamenali události přesměrování na server v datovém úložišti Redis. Když SDK otevře odkaz, provede bootstrap volání na naše servery, které poskytují námi zvolené ID kanálu pro uživatele a tajný klíč. SDK pak vytvoří objekt pracovníka zaměřeného na aplikaci, který volí server pomocí RX intervalového proudu. Při každém volání dotazování poskytujeme serveru ID kanálu, tajný klíč a UUID poslední události (nebo null), abychom získali nejnovější události.

1
2
3
4
5
6
7
8
9
10
11
12

Pozorovatelné.interval (interval, TimeUnit.Sekund)
.subscribeOn(plánovače.výpočet())
.observeOn (AndroidSchedulers.mainThread())
.flatMapSingle (makeNetworkCall())
.přihlásit(
{
// Zpracovat zprávy
},
{
// zpracování chyb
})

Android framework může zabít jakýkoliv proces, včetně aplikace pomocí Kostkované SDK. Vzhledem k tomu, že objekt pracovníka je vázán na aplikaci, mělo by to za následek zastavení pracovníka. Pokud uživatel i nadále toku, (buď úspěšně nebo neúspěšně) SDK by poslední výzva na kanál a získat zbývající události. Události by byly ztraceny pouze v případě, že uživatel přerušil tok a silou zabil aplikaci.

načítání konečného výsledku

podobně jako předávání dat událostí klientům, Link používá adresu URL k signalizaci, že uživatel dokončil tok. Příslušná adresa URL obsahuje potřebná data, jako je veřejný klíč nebo kód chyby.

protože nemůžeme přistupovat k URL pomocí CCT, uložili jsme konečný výsledek v Redis se stejným ID kanálu. I když to znamená, že náš volební pracovník by věděl, kdy Link skončil, neexistovala by žádná záruka, že pracovník bude stále naživu. I kdyby to bylo naživu, uživatel možná bude muset počkat na další výzvu k hlasování, aby byl výsledek doručen, což by mohlo být dlouhé pár sekund.

abychom zajistili, že výsledek bude doručen včas, použijeme hluboký odkaz k opětovnému otevření sady SDK. Hluboký odkaz je vytvořen pomocí ID aplikace aplikace, které musí být přidruženo k tajemství klienta a na panelu pro vývojáře na seznamu povolených. To, plus skutečnost, že pouze jedna aplikace na zařízení, může mít stejné ID aplikace, zajišťuje, že žádné další aplikace zachytit přesměrování. Webová aplikace Link pak vytvoří záměr URI, který je vypálen na konci toku odkazů.

1
2

záměr://redirect/#Záměr;scheme=kostkované;balení=$packageName;end;

Naše SDK obsahuje záměr filtr pro zpracování URI, tak, že aplikace znovu otevře a zavolá přímo na kanál, ihned.

1
2
3
4
5
6
7
8
9
10
11

<intent-filter>
<action android:name="android.záměra.akce.Pohled" />
<kategorie android: name="robot.záměra.kategorie.Výchozí" />
<kategorie android: name="robot.záměra.kategorie.BROWSABLE" />
<data
robot: host= "redirect"
robot:scheme="kostkované" />
</intent-filter>

Ovládání CCT

CCT postrádá rozhraní pro aplikace:

  • poslouchejte, když uživatel zavře činnost

  • rozpoznat, kdy uživatel klikl na „Open in Browser“ možnost

  • nutit k uzavření

úspěšně Jsme pracovali kolem všechny tyto nedostatky.

nejprve, abychom poslouchali, kdy uživatel ukončí aktivitu, otevřeme CCT pomocí startActivityForResult a předáme mu kód požadavku. Pokud uživatel zavře CCT pomocí X v pravém horním rohu systému, tlačítko zpět, onActivityResult zpětného volání je spuštěn s žádostí kód poskytli jsme a výsledek kódu Činnosti.RESULT_CANCELED. Datový záměr neobsahuje žádné informace, ale můžeme uskutečnit konečné volání na kanál, abychom získali zbývající události. Poté je předáme klientské aplikaci a vrátíme objekt LinkCancellation, což signalizuje, že Odkaz byl uživatelem úmyslně uzavřen.

Další potenciální obavy s detekci, když uživatel klikne na „Open in Browser“ je, že uživatel by pak mohl projít celý tok v samostatné působnosti, tedy prohlížeč. To pro nás není problém, protože systémy dotazování a záměrů nadále fungují stejným způsobem a stále můžeme získat potřebná data.

konečně, když uživatel dokončí tok úspěšně a výsledek záměr je vypálen, proces CCT zůstane otevřený a v seznamu úkolů uživatele. Tento fantomový proces by byl nejen zbytečný, ale mohl by být pro uživatele matoucí, když stiskne systémové tlačítko „Poslední úkoly“. Proto potřebujeme způsob, jak donutit CCT uzavřít, když je tok dokončen.

abychom to mohli provést, použili jsme vzor zobrazený v knihovně OpenId AppAuth pro Android. Místo zpracování výsledku v aktivitě, která otevře odkaz, umístíme filtr záměru na samostatnou aktivitu. Tato druhá aktivita zpracovává všechna přesměrování z webové aplikace, které zahrnují: úspěšné dokončení, chyby, které uzavírají tok, přesměrování oAuth nebo App-to-App a obecné systémové chyby. Aktivita pak předává data zpět do úvodní aktivity pomocí záměru se záměrem.FLAG_ACTIVITY_SINGLE_TOP a záměr.FLAG_ACTIVITY_CLEAR_TOP vlajky. Používají se společně, vyčistí vše na zásobníku nad Otevírací aktivitou, včetně CCT.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

val záměr = Záměr(činnost, LinkActivity::třída.java)
when (state) {
is RedirectState.ChromeCustomTabsComplete -> {
záměr.putExtra (LINK_CHROME_CUSTOM_TABS_COMPLETE_REDIRECT, true)
záměr.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, true)
}
záměr.vlajky = záměr.FLAG_ACTIVITY_SINGLE_TOP nebo záměr.FLAG_ACTIVITY_CLEAR_TOP
návrat záměr

alt

Poslední myšlenky na CCT

s cílem poskytnout bezpečný, sandboxed zkušenosti není k dispozici v WebViews nebo nativní toků, CCT je schůdné řešení. Je snadno integrovat s pro vývojáře a poskytuje lepší uživatelský komfort než otevírání oken prohlížeče díky své lehké povaze a rychlosti.

sandboxed povaha CCT a omezené API znamenají, že není bez jeho stinné stránky. Poslech přesměrování URL, získání konečných výsledků a řízení procesu CCT vyžadovalo, abychom přišli s kreativními řešeními. Tato řešení se spoléhala na pochopení vestavěných funkcí systému Android, zejména rámce záměru.

výhody pro vývojáře a spotřebitele byly dobře stojí za požadované úsilí a doporučujeme používat CCT v jiných aplikacích a SDK pro rychlou a bezpečnou integraci. Kromě toho můžete použít Zde uvedené tipy ke zlepšení uživatelského (a vývojářského) zážitku.

pokud máte zájem o řešení jedinečných problémů, které budou využívat tisíce vývojářů a miliony spotřebitelů, navštivte naši stránku kariéra.

You might also like

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.