Webviewien turvaaminen Chrome Custom Tabs

Plaid mahdollistaa innovaattorit fintech-tilassa tarjoamalla heille pääsyn taloudellisiin tietoihin yhtenäisen API: n kautta. Jotta loppukäyttäjät voisivat yhdistää pankkitietonsa fintech-sovelluksiin, Plaid kehitti linkin, pudotusmoduulin, joka käsittelee jokaisen tuetun pankin luottotietojen vahvistamista, monivaiheista todennusta ja virheiden käsittelyä.

Android-kehittäjät joutuivat aiemmin avaamaan Link-URL-osoitteita Webvieweissä. Jokainen sovellus, joka halusi käyttää linkkiä vaati paljon kehittäjän työtä ja, ilman standardointia, siellä oli pakko olla bugeja joissakin toteutuksissa. Kehittäjäkokemuksen parantamiseksi julkaisimme äskettäin SDK: n, jonka avulla WebView on helppo integroida mihin tahansa sovellukseen, jossa on muutama rivi koodia.

lisäksi WebViews ei ole täysin turvallinen loppukäyttäjille, jotka syöttävät arkaluonteisia tietoja Linkkivirtaan. Jotta SDK olisi mahdollisimman turvallinen, olemme toteuttaneet sen Chromen mukautetuilla välilehdillä Android Webviewsin sijaan. Tässä artikkelissa kerromme, miksi olemme tehneet tämän päätöksen ja miten olemme voittaneet teknisiä kysymyksiä kohtasimme matkan varrella.

arvioidessamme vaihtoehtojamme

SDK: na koodimme toimii muiden kehittäjien sovelluksissa ja vastaavasti heidän sovellusprosesseissaan. Jotta Link web-sovellus voidaan suorittaa WebView-palvelussa, Javascript on otettava käyttöön. Tämä avaa oven muille sovelluksille haitallisen koodin ajamiseen, kuten käyttäjänimien ja salasanojen kaappaamiseen tähtäävien puhelinsoittojen rekisteröimiseen. Lisäksi haitallinen sovellus voisi avata toisen web-sivun, joka jäljittelee linkin virtausta tietojenkalasteluyrityksessä.

etsiessämme ratkaisua, joka on helppo integroida kehittäjille, intuitiivinen loppukäyttäjille ja turvallinen, arvioimme useita vaihtoehtoja.:

  1. building a native link flow: Because native Link flows would also run in another app ’ s process, savvy developers could use reflection to find our input Editexts and register callbacks in a way like Javascript in a WebView.

  2. erillisen authenticator-sovelluksen rakentaminen: Tämä tarjoaisi natiivin sandboxed-kokemuksen ja olisi ihanteellinen kokemus loppukäyttäjille; monet käyttäjät eivät kuitenkaan halua ladata ylimääräistä sovellusta Play-Kaupasta. Tämä tarkoittaa, että tarvitsisimme vararatkaisun käyttäjille, jotka kieltäytyvät lataamasta sovellusta.

  3. linkin avaaminen erillisessä selainikkunassa: tämä olisi hiekkalaatikoitu, turvallinen ratkaisu. Lähes kaikilla käyttäjillä on selain asennettuna, mutta asiayhteyden vaihtaminen sovelluksesta selaimeen toisi huomattavan viiveen etenkin low-end-laitteissa.

  4. Chromen mukautettujen välilehtien käyttäminen: Tämä on ratkaisu valitsimme, koska se ei ollut mitään edellä mainittuja haittoja.

valintamme: Chrome Custom Tabs

Chrome custom tabs (CCT) on osa Chrome-selainta, joka integroituu Android frameworkiin, jotta sovellukset voivat avata verkkosivustoja kevyessä prosessissa. CCT avautuu nopeammin kuin selain, ja jos se ladataan lämmittelykutsun kautta, se on mahdollisesti jopa nopeampi kuin WebView. Vaikka se toimii edelleen Javascriptillä, se on omassa prosessissaan, joka estää sovelluksia ajamasta haitallista koodia. Lisäksi CCT-käyttöliittymä tarjoaa toimintarivin, joka näyttää ladattavan sivun URL-osoitteen sekä suojattujen sivujen SSL-vahvistuslukkokuvakkeen. Tämä vakuuttaa käyttäjille, että oikea sivu näytetään.

alt

vaikka kaikki käyttäjät eivät ole Chrome asennettu, valtaosa ei. Niille, jotka eivät, käytämme selaimen varamenetelmää edellä (vaihtoehto 3); muut kuin lisäämällä yhden rivin koodia, saamme varamekanismin ilmaiseksi CCT. Kuten aiemmin todettiin, selaimen varasuunnitelma ei ole ihanteellinen käyttäjäkokemus latenssinsa vuoksi, mutta se pitää yllä Plaid-palvelun vaatimaa korkeaa tietoturvatasoa.

kehittäessämme CCT-ratkaisua törmäsimme useisiin komplikaatioihin ja puutuimme niihin:

  • haetaan tapahtumatietoja

  • haetaan lopputulosta

  • yhteisen tullitariffin toiminnan valvonta & prosessi

tapahtumatiedon saaminen

kun käyttäjä navigoi linkin näyttöjen välillä, tapahtuu uudelleenohjaus ja tiedot annetaan kehittäjille URL-parametreissä.

alt

tämä uudelleenohjaustieto on arvokasta kehittäjille, koska se auttaa heitä ymmärtämään käyttäjän käyttäytymistä. Koska CCT on käynnissä omassa prosessissaan eikä se tarjoa uudelleenohjausta, nämä tiedot olisivat yleensä saavuttamattomissa, mikä tekisi turvallisesta SDK: sta vähemmän toimivan kehittäjille kuin heidän räätälöidyt WebView-toteutuksensa.

antaaksemme nämä tiedot CCT: ltä, tallennimme sen sijaan uudelleenohjaustapahtumat palvelimelle Uudelleensuuntausdatastoreen. Kun SDK avaa linkin, se soittaa bootstrap-puhelun palvelimillemme, jotka tarjoavat valitsemamme käyttäjäkohtaisen kanavan tunnuksen ja salaisen avaimen. Tämän jälkeen SDK luo sovelluksen scoped worker-objektin, joka tarkkailee palvelinta käyttäen RX-intervallivirtaa. Jokaisella äänestyspuhelulla tarjoamme palvelimelle kanavan ID: n, salaisen avaimen ja viimeisen tapahtuman UUID: n (tai null) saadaksesi uusimmat tapahtumat.

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

havaittavissa.intervalli (intervalli, TimeUnit.Sekuntia)
.subscribeOn (Schedulers.laskenta())
.observeOn (AndroidSchedulers.mainThread())
.flatMapSingle(makeNetworkCall())
.tilaa(
{
// käsittele viestejä
},
{
// käsittele virheitä
})

Android framework voi tappaa minkä tahansa prosessin, mukaan lukien Plaid: n SDK: ta käyttävän sovelluksen. Koska työkohde on sidottu hakemukseen, tämä johtaisi työntekijän pysäyttämiseen. Jos käyttäjä jatkoi virtausta, (joko onnistuneesti tai tuloksetta) SDK soittaisi viimeisen puhelun kanavalle ja saisi loput tapahtumat. Tapahtumat häviäisivät vain, jos käyttäjä keskeyttäisi virtauksen ja voima tappaisi sovelluksen.

hakee lopputuloksen

samalla tavalla kuin välittää tapahtumatietoja asiakkaille, Link käyttää URL-osoitetta osoittaakseen, että käyttäjä on suorittanut virtauksen. URL-osoite sisältää tarvittavat tiedot, kuten julkisen avaimen tai virhekoodin.

koska verkko-osoitetta ei voi käyttää CCT: llä, tallennimme lopputuloksen uudelleen samalla kanavakoodilla. Vaikka tämä tarkoittaa sitä, että äänestystyöntekijämme tietäisi, milloin Link on lopettanut, ei olisi mitään takeita siitä, että työntekijä olisi vielä elossa. Vaikka se olisi elossa, käyttäjä voi joutua odottamaan seuraavaan äänestyskutsuun tuloksen toimittamista, mikä voi olla pitkä pari sekuntia.

varmistaaksemme, että tulos toimitetaan ajoissa, käytämme syvää linkkiä avataksemme SDK: n uudelleen. Syvä linkki on rakennettu käyttämällä sovelluksen app ID, joka on liitettävä asiakkaan salaisuus ja whitelisted kehittäjän kojelautaan. Tämä, plus se, että vain yksi sovellus laitteessa voi olla sama app ID, takaa mitään muita sovelluksia siepata uudelleenohjaus. Tämän jälkeen Link-verkkosovellus rakentaa intent-Urin, joka laukaistaan Linkkivirran lopussa.

1
2

intent:/ / redirect/#Intent;scheme=plaid;package=$packageName; end;

SDK: ssa on intent-suodatin URI: n käsittelyyn, jolloin sovellus avautuu uudelleen ja soittaa puhelun suoraan kanavalle välittömästi.

1
2
3
4
5
6
7
8
9
10
11

<intent-suodatin>
<toiminta-android: name= " android.tarkoitus.toimia.Näytä" />
<luokka android:name= " android.tarkoitus.luokka.Oletus" />
<luokka android:name= " android.tarkoitus.luokka.Selattava" />
<data
android:host= "redirect"
android:scheme= "plaid" />
</intent-suodatin>

Controlling CCT

CCT puuttuu liitännät sovelluksen:

  • Kuuntele, milloin käyttäjä sulkee toiminnon

  • tunnista, kun käyttäjä on klikannut ”Avaa selaimessa” – vaihtoehtoa

  • pakota se sulkemaan

olemme onnistuneet korjaamaan kaikki nämä puutteet.

Kuunnellaksemme ensin, Kun käyttäjä sulkee toiminnon, avaamme CCT: n käyttäen startactivityforresultia ja annamme sille pyyntökoodin. Jos käyttäjä sulkee CCT: n käyttämällä X: ää järjestelmän takaisin-painikkeen vasemmassa yläkulmassa, onActivityResult-takaisinsoitto käynnistyy antamallamme pyyntökoodilla ja toiminnan tuloskoodilla.Tulos peruutettu. Datatarkoitus ei sisällä mitään tietoa, mutta voimme soittaa kanavalle viimeisen puhelun, jotta saamme loput tapahtumat. Tämän jälkeen siirrämme ne asiakassovellukseen ja palautamme LinkCancellation-objektin, mikä merkitsee, että käyttäjä on sulkenut linkin tarkoituksellisesti.

seuraavaksi mahdollinen huoli havaitsemisesta, kun käyttäjä on napsauttanut ”Avaa selaimessa”, on se, että käyttäjä voisi sitten käydä läpi koko virtauksen erillisessä sovelluksessa eli selaimessa. Tämä ei ole meille ongelma, koska kysely-ja aikomusjärjestelmät toimivat edelleen samalla tavalla ja voimme edelleen saada tarvittavat tiedot.

lopulta, kun käyttäjä suorittaa virtauksen onnistuneesti ja tulosaikomus laukaistaan, CCT-prosessi jää avoimeksi ja käyttäjän tehtäväluetteloon. Tämä phantom prosessi ei olisi vain tuhlaava, mutta voi myös olla hämmentävää käyttäjälle, kun he painavat ”viimeaikaiset tehtävät” järjestelmän painiketta. Siksi tarvitsemme tavan pakottaa CCT sulkemaan, kun virtaus on valmis.

tähän tarkoitukseen käytimme OpenId AppAuth for Android-kirjastossa esitettyä kaavaa. Sen sijaan, että käsittelisimme tulosta linkkiä avaavassa toiminnassa, asetamme intent-suodattimen erilliseen toimintaan. Tämä toinen toiminto käsittelee kaikki uudelleenohjaukset web-sovelluksesta, jotka sisältävät: onnistuneet täydennykset, virheet, jotka sulkevat virtauksen, oAuth tai App-to-App uudelleenohjaukset, ja yleiset järjestelmävirheet. Tämän jälkeen toiminta siirtää tiedot takaisin avaustoimintaan käyttäen aikomusta aikomuksen kanssa.FLAG_ACTIVITY_SINGLE_TOP ja Intent.FLAG_ACTIVITY_CLEAR_TOP-liput. Yhdessä käytettynä ne tyhjentävät kaiken avausaktiivisuuden yläpuolella olevasta pinosta, mukaan lukien CCT.

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

val intent = Intent (aktiivisuus, Yhteysaktiivisuus:: Luokka.java)
kun (tila) {
ohjataan uudelleen.Chromecustomtabsomplete -> {
aikomus.putExtra (LINK_CHROME_CUSTOM_TABS_COMPLETE_REDIRECT, true)
intent.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)
}
aikomus.liput = aikomus.FLAG_ACTIVITY_SINGLE_TOP tai Intent.FLAG_ACTIVITY_CLEAR_TOP
return intent

alt

lopulliset ajatukset CCT: stä

CCT on toimiva ratkaisu tarjotakseen turvallisen, hiekkalaatikkokokemuksen, jota ei ole saatavilla Webviewsissä tai native flowsissa. Se on helppo integroida kehittäjille ja tarjoaa paremman käyttökokemuksen kuin selainikkunan avaaminen kevyen luonteensa ja nopeutensa ansiosta.

CCT: n hiekkalaatikkoisuus ja rajattu API tarkoittavat, että se ei ole vailla varjopuoliaan. URL-osoitteiden uudelleenohjausten kuuntelu, lopullisten tulosten saaminen ja CCT-prosessin hallinta vaativat meiltä luovia ratkaisuja. Nämä ratkaisut perustuivat ymmärrykseen Androidin sisäänrakennetuista ominaisuuksista, erityisesti intent Frameworkista.

kehittäjille ja kuluttajille koituva hyöty oli vaaditun vaivan arvoinen, ja suosittelemme käyttämään CCT: tä muissa sovelluksissa ja SDK: ssa nopean ja turvallisen integraation aikaansaamiseksi. Lisäksi, voit käyttää vinkkejä tässä parantaa käyttäjä (ja Kehittäjä) kokemus.

jos olet kiinnostunut ratkaisemaan ainutlaatuisia ongelmia, joita tuhannet kehittäjät ja miljoonat kuluttajat käyttävät, vieraile urasivullamme.

You might also like

Vastaa

Sähköpostiosoitettasi ei julkaista.