TakéAutentizace v mobilních aplikacích, Mobile auth, Ověření uživatele v mobilní aplikaciPokročilý

Definice

Mobilní autentizace je ověření totožnosti uživatele v mobilní aplikaci nebo pomocí mobilního zařízení, typicky kombinací hesla, biometrie odemykající klíč v bezpečném prvku telefonu, SMS kódu, push potvrzení nebo passkey. Výsledkem je token, kterým aplikace prokazuje identitu serveru po dobu platnosti relace.

Kategorie: Mobilní vývojAktualizováno

Nezaměňujte: Mobilní autentizace může znamenat jak přihlašování uvnitř mobilní aplikace, tak použití telefonu jako ověřovacího prostředku pro jiný systém (bankovní klíč, potvrzení přihlášení na webu).

Co dělá autentizaci na telefonu jinou než na webu

Mobilní aplikace nemá prohlížeč, který by za ni spravoval cookies, a zároveň běží na zařízení, které uživatel nosí u sebe a odemyká desítky krát denně. Z toho plyne dvojí posun: přihlašovací stav musí přežít týdny bez opětovného zadání hesla, ale zároveň nesmí být dostupný komukoli, kdo telefon zvedne ze stolu. Praktickým řešením je dvojice tokenů. Krátkodobý access token se posílá s každým voláním API, dlouhodobý refresh token leží v systémovém úložišti klíčů (Keychain na iOS, Keystore na Androidu) a jeho použití se podmíní odemčením obrazovky nebo otiskem prstu.

Role biometrie: co vlastně ověřuje

Biometrie na telefonu neposílá otisk prstu ani sken obličeje na server. Face ID i Android BiometricPrompt fungují jako lokální brána: zařízení porovná vzorek v bezpečném hardwarovém prvku a v případě shody zpřístupní privátní klíč nebo dešifruje uložený token. Server se tedy nedozví „tenhle obličej souhlasí“, ale dostane podpis klíčem, ke kterému se dá dostat jen po úspěšném odemčení. Proto je biometrie faktorem vlastnictví zařízení plus vlastností uživatele, nikoli náhradou serverové logiky.

Přehled používaných metod

  • Heslo přes OAuth 2.0 / OpenID Connect: přihlášení proběhne v systémovém prohlížeči (Custom Tabs, ASWebAuthenticationSession), aplikace nikdy nevidí heslo a dostane jen autorizační kód s PKCE.
  • Passkey / WebAuthn: klíčový pár vázaný na doménu, odolný vůči phishingu, synchronizovaný přes iCloud Keychain nebo Google Password Manager.
  • SMS OTP: nejrozšířenější, ale nejslabší varianta kvůli SIM swapu a přeposílání kódů.
  • Push potvrzení: banka pošle notifikaci a uživatel transakci schválí v aplikaci; typický nosič silného ověření podle PSD2.
  • Magic link a kódy z autentikátoru (TOTP) pro aplikace bez vlastní identity infrastruktury.

Kde se to nejčastěji rozbije

Ukládání tokenu do SharedPreferences, UserDefaults nebo do souboru v sandboxu je nejběžnější chyba: na rootnutém či jailbreaknutém zařízení jde o prostý text. Druhým opakovaným problémem je vlastní přihlašovací WebView, které aplikaci umožní odečíst heslo a zároveň znemožní správci hesel doplnit údaje. Třetím je chybějící invalidace refresh tokenu při odhlášení nebo změně hesla, takže odcizená relace přežije reakci uživatele. Nezanedbatelné je i omezení počtu pokusů na straně serveru, jinak se z přihlašovacího endpointu stane cíl credential stuffingu.

Registrace zařízení jako trvalý faktor

Zralé implementace při prvním přihlášení vygenerují na zařízení klíčový pár a veřejný klíč zaregistrují k účtu. Další přihlášení pak probíhá výzvou a podpisem, což je vlastně princip dvoufaktorového ověření bez sdíleného tajemství. Přidat se dá attestace platformy (Play Integrity, App Attest), která serveru napoví, zda požadavek přišel z neupravené aplikace.

Příklady z praxe

  1. Refresh token chráněný biometrií na iOS

    E-shopová aplikace drží refresh token v Keychainu s příznakem, který vyžaduje odemčení zařízení a přítomnost biometrie. Když uživatel otevře aplikaci po týdnu, systém si vyžádá Face ID a teprve pak aplikace získá token a vymění ho za nový access token. Bez odemčení se položka nedá přečíst ani po zkopírování zálohy.

    let access: [String: Any] = [
      kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
    ]
    let query: [String: Any] = [
      kSecClass as String: kSecClassGenericPassword,
      kSecAttrService as String: "cz.example.app.refresh",
      kSecValueData as String: refreshToken.data(using: .utf8)!,
    ]
    SecItemAdd(query.merging(access) { a, _ in a } as CFDictionary, nil)
  2. Přihlášení přes OAuth 2.0 s PKCE v systémovém prohlížeči

    Aplikace neotevře vlastní WebView, ale systémovou kartu prohlížeče na autorizačním serveru. Vygeneruje náhodný code_verifier, pošle jeho hash jako code_challenge a po návratu přes vlastní URL schéma vymění autorizační kód za tokeny. Odcizený kód je tak bez znalosti verifieru nepoužitelný.

    const verifier = base64url(crypto.getRandomValues(new Uint8Array(32)));
    const challenge = base64url(await crypto.subtle.digest('SHA-256', enc.encode(verifier)));
    const url = `https://id.example.com/authorize?response_type=code`
      + `&client_id=mobile-app&redirect_uri=cz.example.app:/cb`
      + `&code_challenge=${challenge}&code_challenge_method=S256`;

Časté omyly

MýtusOtisk prstu se posílá na server, takže si ho firma ukládá.
Ve skutečnostiBiometrický vzorek zůstává v bezpečném prvku telefonu a nikdy zařízení neopouští. Server dostane jen podpis nebo token, který se zpřístupní po úspěšném lokálním ověření.
MýtusKdyž má aplikace přihlášení otiskem, je automaticky dvoufaktorová.
Ve skutečnostiBiometrie odemyká tajemství uložené v zařízení, takže jde o jeden ověřovací tok postavený na vlastnictví telefonu. Skutečný druhý faktor vzniká až tehdy, když se k němu přidá nezávislý prvek, typicky heslo nebo serverem řízená výzva.
MýtusSMS kód je dostatečně bezpečný druhý faktor pro cokoli.
Ve skutečnostiSMS kódy jsou zranitelné vůči SIM swapu, přesměrování zpráv a sociálnímu inženýrství. U citlivých operací se doporučuje passkey, hardwarový klíč nebo push potvrzení podepsané klíčem v zařízení.

Časté dotazy

Kam se má v mobilní aplikaci ukládat přihlašovací token?
Přihlašovací token patří do systémového úložiště klíčů: Keychain na iOS a Android Keystore, ideálně přes EncryptedSharedPreferences nebo klíč vázaný na odemčení zařízení. UserDefaults, SharedPreferences, obyčejný soubor v sandboxu ani lokální databáze nejsou vhodné, protože na rootnutém zařízení nebo v záloze jde o čitelná data. Access token je rozumné držet pouze v paměti procesu a po restartu ho získat výměnou refresh tokenu. Refresh token by měl mít omezenou platnost, rotovat při každém použití a být okamžitě zneplatnitelný na serveru.
Je passkey v mobilní aplikaci lepší než SMS kód?
Passkey nabízí podstatně vyšší úroveň ochrany než SMS kód, protože klíčový pár je svázaný s konkrétní doménou a podpis nelze použít na podvodném webu. Odpadá tak celá třída phishingových útoků i riziko SIM swapu. Nevýhodou je horší podpora u starších zařízení a nutnost promyslet obnovu přístupu, když uživatel přijde o telefon i o synchronizační účet. Mnoho aplikací proto ponechává SMS jako záložní kanál, ale s nižšími limity pro citlivé operace.
Proč se doporučuje přihlašovat přes systémový prohlížeč místo WebView?
Systémový prohlížeč (SFSafariViewController, ASWebAuthenticationSession, Chrome Custom Tabs) běží mimo proces aplikace, takže aplikace nemůže odečíst zadané heslo ani manipulovat s obsahem stránky. Uživatel navíc vidí skutečnou adresu a správce hesel i passkeye fungují normálně. Vlastní WebView tyto záruky ruší, řada poskytovatelů identity ho z bezpečnostních důvodů blokuje a recenzní procesy obchodů s aplikacemi ho hodnotí negativně. Doporučení shrnuje specifikace OAuth 2.0 pro nativní aplikace.
Jak řešit odhlášení, když uživatel ztratí telefon?
Ztráta telefonu se řeší na straně serveru, ne v aplikaci. Každé zařízení by mělo mít vlastní záznam relace s identifikátorem, aby šlo v nastavení účtu zobrazit seznam přihlášených zařízení a jednotlivě je zneplatnit. Zneplatnění musí zrušit refresh token okamžitě; krátká platnost access tokenu pak omezí okno, kdy odcizené zařízení ještě funguje. Doplňkově pomáhá zneplatnit všechny relace při změně hesla a odeslat uživateli notifikaci o novém přihlášení z neznámého zařízení.

Zdroje

  1. OAuth 2.0 for Native Apps(otevře se v novém okně)IETF / RFC Editor, 2017
  2. Web Authentication: An API for accessing Public Key Credentials(otevře se v novém okně)W3C, 2021
  3. OWASP Mobile Application Security(otevře se v novém okně)OWASP
  4. Digital Identity Guidelines (NIST SP 800-63)(otevře se v novém okně)NIST, 2017

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.