securizarea vizualizărilor web cu Chrome Custom Tabs

Plaid împuternicește inovatorii în spațiul fintech, oferindu-le acces la date financiare printr-un API uniform. Pentru a ajuta utilizatorii finali să își conecteze datele bancare la aplicațiile fintech, Plaid a dezvoltat Link, un modul drop-in care gestionează validarea acreditărilor, autentificarea cu mai mulți factori și gestionarea erorilor pentru fiecare bancă acceptată.

dezvoltatorii Android au trebuit anterior să deschidă URL-uri de legătură în vizualizările web. Fiecare aplicație care dorea să utilizeze Link a necesitat mult efort pentru dezvoltatori și, fără standardizare, au fost obligate să existe bug-uri în unele dintre implementări. Pentru a îmbunătăți experiența dezvoltatorului, am lansat recent un SDK care face WebView ușor de integrat în orice aplicație cu câteva linii de cod.

în plus, vizualizările web nu sunt complet sigure pentru utilizatorii finali care introduc informații sensibile în fluxul de legături. Pentru a face SDK-ul nostru cât mai sigur posibil, l-am implementat folosind file personalizate Chrome în loc de vizualizări Web Android. În acest articol vă explicăm de ce am luat această decizie și cum am depășit problemele tehnice pe care le-am întâlnit pe parcurs.

evaluarea opțiunilor noastre

ca SDK, codul nostru rulează în aplicațiile altor dezvoltatori și, la rândul său, procesele lor de aplicare. Pentru a rula aplicația Link web într-un WebView, Javascript trebuie să fie activat. Aceasta deschide ușa pentru ca alte aplicații să ruleze cod rău intenționat, cum ar fi înregistrarea apelurilor care încearcă să intercepteze numele de utilizator și parolele. În plus, o aplicație rău intenționată ar putea deschide o altă pagină web care imită fluxul de linkuri într-o încercare de phishing.

când căutăm o soluție ușor de integrat pentru dezvoltatori, intuitivă pentru utilizatorii finali și sigură, am evaluat mai multe opțiuni:

  1. construirea unui flux de link nativ: deoarece fluxurile de Link-uri native ar rula și în procesul altei aplicații, dezvoltatorii pricepuți ar putea folosi reflecția pentru a găsi Edittextele noastre de intrare și pentru a înregistra apelurile înapoi într-un mod similar cu Javascript într-un WebView.

  2. construirea unei aplicații authenticator separat: Acest lucru ar oferi o experiență nativă sandboxed și ar fi o experiență ideală pentru utilizatorii finali; cu toate acestea, mulți utilizatori nu ar dori să descarce o aplicație suplimentară din Play Store. Aceasta înseamnă că vom avea nevoie de o soluție de rezervă pentru utilizatorii care refuză să descarce aplicația.

  3. deschiderea Link-ului într-o fereastră separată a browserului: aceasta ar fi o soluție sigură și sigură. Aproape toți utilizatorii au instalat un browser, dar trecerea contextului de la o aplicație la un browser ar introduce o întârziere vizibilă, în special pe dispozitivele low-end.

  4. utilizarea filelor personalizate Chrome: Aceasta este soluția pe care am ales-o, deoarece nu a avut niciunul dintre dezavantajele menționate mai sus.

alegerea noastră: Chrome Custom Tabs

Chrome Custom tabs (CCT) este o parte a browserului Chrome care se integrează cu cadrul Android pentru a permite aplicațiilor să deschidă site-uri web într-un proces ușor. CCT se deschide mai repede decât un browser și, dacă este preîncărcat prin apelul său de încălzire, este potențial chiar mai rapid decât un WebView. În timp ce rulează încă Javascript, este în propriul proces, care împiedică aplicațiile să ruleze cod rău intenționat. În plus, UI CCT oferă o bară de acțiune care arată adresa URL a paginii încărcate, împreună cu o pictogramă de blocare a verificării SSL pentru paginile securizate. Acest lucru asigură utilizatorii că pagina corectă este afișată.

alt

deși nu toți utilizatorii au instalat Chrome, marea majoritate o fac. Pentru cei care nu, folosim metoda de rezervă a browserului descrisă mai sus (Opțiunea 3); în afară de adăugarea unei linii de cod, obținem opțiunea de rezervă gratuit de la CCT. După cum sa menționat anterior, rezerva browserului nu este experiența ideală a utilizatorului datorită latenței sale, dar menține nivelul ridicat de securitate pe care îl necesită Plaid.

pe măsură ce am dezvoltat soluția CCT, am întâlnit și am abordat mai multe complicații:

  • obținerea datelor evenimentului

  • recuperarea rezultatului final

  • controlul activității CCT & proces

obținerea datelor evenimentului

când un utilizator navighează între ecrane în legătură, apare o redirecționare și datele sunt furnizate dezvoltatorilor în parametrii URL.

alt

aceste informații de redirecționare sunt valoroase pentru dezvoltatori, deoarece îi ajută să înțeleagă comportamentul utilizatorului. Cu CCT rulează în propriul proces și nu oferă un apel invers de redirecționare, aceste informații ar fi în mod normal inaccesibile, ceea ce ar face SDK-ul nostru securizat mai puțin funcțional pentru dezvoltatori decât implementările lor personalizate WebView.

pentru a furniza aceste informații de la CCT, am înregistrat în schimb evenimentele de redirecționare pe server într-un magazin de date Redis. Când SDK-ul deschide Link-ul, face un apel bootstrap către serverele noastre, care oferă un ID de canal per utilizator ales de noi și o cheie secretă. SDK-ul creează apoi un obiect lucrător app scoped, care sondează serverul folosind un flux interval RX. La fiecare apel de votare oferim serverului ID-ul canalului, cheia secretă și UUID-ul ultimului eveniment (sau null) pentru a obține cele mai recente evenimente.

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

observabil.interval (interval, Timpunitate.Secunde)
.subscribeOn (Schedulers.calcul())
.observeOn (AndroidSchedulers.mainThread())
.flatMapSingle (makeNetworkCall())
.Aboneaza-te(
{
// Gestionați mesajele
},
{
// manipulați Erorile
})

cadrul Android poate ucide orice proces, inclusiv aplicația folosind SDK-ul lui Plaid. Deoarece obiectul lucrătorului este legat de aplicație, Acest lucru ar duce la oprirea lucrătorului. Dacă utilizatorul a continuat fluxul, (fie cu succes, fie fără succes) SDK-ul va efectua un apel final către canal și va obține evenimentele rămase. Evenimentele s-ar pierde numai dacă utilizatorul a întrerupt fluxul și forța a ucis aplicația.

preluarea rezultatului Final

Similar cu transmiterea datelor de eveniment către clienți, Link utilizează URL-ul pentru a semnala că utilizatorul a finalizat fluxul. Adresa URL relevantă include datele necesare, cum ar fi cheia publică sau un cod de eroare.

deoarece nu putem accesa URL-ul cu CCT, am stocat rezultatul final în Redis cu același ID de canal. În timp ce acest lucru înseamnă că lucrătorul nostru de votare ar ști când Link-ul a terminat, nu ar exista nici o garanție că lucrătorul ar fi încă în viață. Chiar dacă ar fi în viață, utilizatorul ar putea fi nevoit să aștepte până la următorul apel de votare pentru ca rezultatul să fie livrat, ceea ce ar putea dura câteva secunde.

pentru a ne asigura că un rezultat este livrat în timp util, folosim un link profund pentru a redeschide SDK-ul. Legătura profundă este construită folosind ID-ul aplicației aplicației, care trebuie asociat cu secretul clientului și pe lista albă pe tabloul de bord al dezvoltatorului. Acest lucru, plus faptul că o singură aplicație de pe un dispozitiv poate avea același ID de aplicație, asigură că nicio altă aplicație nu interceptează redirecționarea. Aplicația web Link construiește apoi un uri de intenție, care este tras la sfârșitul fluxului de legătură.

1
2

intenție: / / redirecționare/ # intenție; schemă=plaid; pachet= $ packageName; sfârșit;

SDK-ul nostru include un filtru de intenție pentru a gestiona URI-ul, astfel încât aplicația să se redeschidă și să efectueze imediat un apel direct către canal.

1
2
3
4
5
6
7
8
9
10
11

<intenție-filtru>
<acțiune android: nume= " android.intenție.acțiune.Vezi" />
<categorie android: nume= " android.intenție.Categorie.Implicit" />
<categorie android: nume= " android.intenție.Categorie.Navigabil" />
<date
android: host=" redirecționare "
android:schema= "plaid" />
</intenție-filtru>

controlul CCT

CCT nu are interfețe pentru app pentru a:

  • ascultați când utilizatorul închide activitatea

  • detectați când utilizatorul a făcut clic pe opțiunea ” Deschideți în Browser

  • forțați-l să se închidă

am rezolvat cu succes toate aceste neajunsuri.

mai întâi, pentru a asculta când utilizatorul închide activitatea, deschidem CCT folosind startActivityForResult și îi transmitem un cod de solicitare. Dacă utilizatorul închide CCT folosind X în colțul din stânga sus al butonului system back, apelul invers onActivityResult este declanșat cu codul de solicitare pe care l-am furnizat și un cod de activitate rezultat.RESULT_CANCELED. Intenția de date nu include nicio informație, dar putem efectua un apel final către canal pentru a obține evenimentele rămase. Apoi le transmitem aplicației client și returnăm un obiect LinkCancellation, semnalizând că linkul a fost închis intenționat de utilizator.

în continuare, preocuparea potențială cu detectarea când utilizatorul a făcut clic pe „Deschide în Browser” este că utilizatorul ar putea trece apoi prin întregul flux într-o aplicație separată, și anume browserul. Aceasta nu este o problemă pentru noi, deoarece sistemele de votare și intenție continuă să funcționeze în același mod și putem obține în continuare datele necesare.

în cele din urmă, când utilizatorul finalizează fluxul cu succes și intenția rezultatului este declanșată, procesul CCT va rămâne deschis și în lista de sarcini a utilizatorului. Acest proces fantomă nu numai că ar fi risipitor, dar ar putea fi confuz și pentru un utilizator atunci când apasă butonul de sistem „sarcini recente”. Prin urmare, avem nevoie de o modalitate de a forța CCT să se închidă atunci când fluxul este complet.

pentru a face acest lucru, am folosit modelul prezentat în OpenID AppAuth pentru biblioteca Android. În loc să gestionăm rezultatul în legătura activitate care deschide, plasăm filtrul intenție pe o activitate separată. Această a doua activitate gestionează toate redirecționările din aplicația web, care includ: completări reușite, erori care închid redirecționările flow, OAuth sau App-to-App și erori generale de sistem. Activitatea apoi trece datele înapoi la activitatea de deschidere folosind o intenție cu intenția.FLAG_ACTIVITY_SINGLE_TOP și intenție.FLAG_ACTIVITY_CLEAR_TOP steaguri. Utilizate împreună, ele clar totul pe stiva de mai sus activitatea de deschidere, inclusiv CCT.

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

val intenție = intenție (activitate, Linkactivitate::clasă.java)
când (stat) {
este RedirectState.ChromeCustomTabsComplete -> {
intenție.putExtra (LINK_CHROME_CUSTOM_TABS_COMPLETE_REDIRECT, adevărat)
intenție.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, adevărat)
}
intenție.steaguri = intenție.FLAG_ACTIVITY_SINGLE_TOP sau intenție.FLAG_ACTIVITY_CLEAR_TOP
intenție de returnare

alt

gânduri finale pe CCT

pentru a oferi o experiență sigură, sandboxed nu este disponibil în WebViews sau fluxuri native, CCT este o soluție viabilă. Este ușor de integrat pentru dezvoltatori și oferă o experiență de utilizare mai bună decât deschiderea ferestrelor browserului datorită naturii și vitezei sale ușoare.

natura sandboxed CCT și API limitat înseamnă că nu este fără dezavantaje sale. Ascultarea redirecționărilor URL, obținerea rezultatelor finale și controlul procesului CCT ne-au cerut să venim cu soluții creative. Aceste soluții s-au bazat pe o înțelegere a funcțiilor încorporate Android, în special a intent framework.

beneficiile pentru dezvoltatori și consumatori au meritat efortul necesar și vă recomandăm să utilizați CCT în alte aplicații și SDK-uri pentru o integrare rapidă și sigură. Mai mult, puteți utiliza sfaturile oferite aici pentru a îmbunătăți experiența utilizatorului (și dezvoltatorului).

dacă sunteți interesat să rezolvați probleme unice care vor fi utilizate de mii de dezvoltatori și milioane de consumatori, vizitați pagina noastră de cariere.

You might also like

Lasă un răspuns

Adresa ta de email nu va fi publicată.