Studia przypadków

Zoho 6-krotnie przyspiesza logowanie dzięki integracji klucza dostępu i Menedżera danych logowania

Czas czytania: 10 minut

Jako deweloper aplikacji na Androida nieustannie szukasz sposobów na zwiększenie bezpieczeństwa, poprawę wrażeń użytkowników i usprawnienie procesu tworzenia aplikacji. Zoho, kompleksowy pakiet oprogramowania w chmurze, który koncentruje się na bezpieczeństwie i płynnym działaniu, osiągnął znaczną poprawę dzięki wprowadzeniu kluczy dostępu w aplikacji na Androida OneAuth.

Od wprowadzenia kluczy dostępu w 2024 r. firma Zoho osiągnęła 6-krotnie szybsze logowanie niż w przypadku poprzednich metod oraz 31-procentowy wzrost liczby użytkowników kluczy dostępu w ujęciu miesięcznym.

W tym studium przypadku przyglądamy się wdrożeniu kluczy dostępu i interfejsu Credential Manager API na Androidzie przez firmę Zoho w celu rozwiązania problemów z uwierzytelnianiem. Opisuje proces implementacji technicznej i podkreśla znaczące wyniki.

Rozwiązywanie problemów z uwierzytelnianiem

Zoho korzysta z różnych metod uwierzytelniania, aby chronić konta użytkowników. Obejmowało to Zoho OneAuth, czyli własne rozwiązanie do uwierzytelniania wielopoziomowego (MFA), które obsługiwało uwierzytelnianie oparte na hasłach i bez haseł za pomocą powiadomień push, kodów QR i haseł jednorazowych generowanych na podstawie czasu (TOTP). Zoho obsługuje też logowanie federacyjne, które umożliwia uwierzytelnianie za pomocą SAML (Security Assertion Markup Language) i innych dostawców tożsamości.

Wyzwania

Firma Zoho, podobnie jak wiele innych organizacji, chciała zwiększyć bezpieczeństwo uwierzytelniania i poprawić wrażenia użytkowników, a jednocześnie zmniejszyć obciążenie operacyjne. Główne wyzwania, które doprowadziły do wprowadzenia kluczy dostępu, to:

  • Luki w zabezpieczeniach: tradycyjne metody oparte na hasłach narażały użytkowników na ataki typu phishing i ujawnienie haseł.
  • Trudności dla użytkowników: zmęczenie hasłami prowadziło do zapominania haseł, frustracji i większego polegania na uciążliwych procesach odzyskiwania.
  • Niska wydajność operacyjna: obsługa resetowania haseł i problemów z uwierzytelnianiem dwuskładnikowym generowała znaczne koszty pomocy.
  • Problemy ze skalowalnością: rosnąca baza użytkowników wymagała bezpieczniejszego i wydajniejszego rozwiązania do uwierzytelniania.

Dlaczego przechodzimy na klucze dostępu?

Klucze dostępu zostały wdrożone w aplikacjach Zoho, aby rozwiązać problemy z uwierzytelnianiem, oferując podejście bez hasła, które znacznie poprawia bezpieczeństwo i wrażenia użytkowników. To rozwiązanie wykorzystuje odporne na phishing uwierzytelnianie, synchronizowane w chmurze dane logowania, które umożliwiają łatwy dostęp na różnych urządzeniach, oraz dane biometryczne (np. odcisk palca lub rozpoznawanie twarzy), kod PIN lub wzór, które zapewniają bezpieczne logowanie. Dzięki temu zmniejsza podatność na zagrożenia i niedogodności związane z tradycyjnymi hasłami.

Dzięki wprowadzeniu kluczy dostępu za pomocą Menedżera danych logowania firma Zoho skróciła czas logowania nawet 6-krotnie, obniżyła koszty pomocy związane z hasłami i odnotowała wysoki poziom wdrożenia wśród użytkowników – w ciągu 4 miesięcy podwoiła liczbę logowań za pomocą kluczy dostępu, a miesięczny wzrost wyniósł 31% . Użytkownicy Zoho mogą teraz korzystać z szybszego i łatwiejszego logowania oraz zabezpieczeń odpornych na phishing.

ANDDM_Zoho_Quote_fabrice.png

Implementacja z użyciem Menedżera danych logowania na Androidzie

Jak Zoho osiągnęło te wyniki? Użyli interfejsu Credential Manager API na Androidzie, czyli zalecanej biblioteki Jetpack do wdrażania uwierzytelniania na Androidzie.

Credential Manager udostępnia ujednolicony interfejs API, który upraszcza obsługę różnych metod uwierzytelniania. Zamiast korzystać z różnych interfejsów API do obsługi haseł, kluczy dostępu i logowania federacyjnego (np. Zaloguj się przez Google), możesz używać jednego interfejsu.

Wdrożenie kluczy dostępu w Zoho wymagało wprowadzenia zmian zarówno po stronie klienta, jak i po stronie serwera. Oto szczegółowe omówienie procesu tworzenia klucza dostępu, logowania się i wdrażania po stronie serwera.

Tworzenie klucza dostępu

passkey.png

Aby utworzyć klucz dostępu, aplikacja najpierw pobiera szczegóły konfiguracji z serwera Zoho. Ten proces obejmuje unikalną weryfikację, np. za pomocą odcisku palca lub rozpoznawania twarzy. Te dane weryfikacyjne (sformatowane jako ciąg znaków requestJson) są używane przez aplikację do tworzenia obiektu CreatePublicKeyCredentialRequest. Aplikacja wywołuje następnie metodę credentialManager.createCredential, która wyświetla użytkownikowi prośbę o uwierzytelnienie za pomocą blokady ekranu urządzenia (danych biometrycznych, odcisku palca, kodu PIN itp.).

Po potwierdzeniu przez użytkownika aplikacja otrzymuje nowe dane logowania za pomocą klucza dostępu, odsyła je do serwera Zoho w celu weryfikacji, a serwer zapisuje informacje o kluczu dostępu powiązane z kontem użytkownika. Aplikacja wykrywa i obsługuje błędy lub anulowania przez użytkownika podczas procesu.

Zaloguj się

Aplikacja Zoho na Androida inicjuje proces logowania za pomocą klucza dostępu, wysyłając do serwera backendu Zoho żądanie opcji logowania, w tym unikalnego challenge. Aplikacja używa tych danych do utworzenia GetCredentialRequest, co oznacza, że uwierzytelnianie nastąpi za pomocą klucza dostępu. Następnie wywołuje interfejs CredentialManager.getCredential() API Androida z tym żądaniem. Ta czynność wywołuje standardowy interfejs systemu Android, który prosi użytkownika o wybranie konta Zoho (jeśli istnieje wiele kluczy dostępu) i uwierzytelnienie za pomocą skonfigurowanej blokady ekranu urządzenia (odcisku palca, skanu twarzy lub kodu PIN). Po udanym uwierzytelnieniu Menedżer danych logowania zwraca do aplikacji Zoho podpisaną asercję (dowód logowania). Aplikacja przekazuje tę asercję na serwer Zoho, który weryfikuje podpis za pomocą zapisanego klucza publicznego użytkownika i sprawdza wyzwanie, co kończy proces bezpiecznego logowania.

Implementacja po stronie serwera

Przejście Zoho na obsługę kluczy dostępu było łatwiejsze dzięki temu, że systemy backendowe tej firmy były już zgodne z protokołem FIDO WebAuthn, co usprawniło proces wdrażania po stronie serwera. Konieczne były jednak pewne modyfikacje, aby w pełni zintegrować funkcję klucza dostępu.

Największym wyzwaniem było dostosowanie magazynu danych logowania. Dotychczasowe metody uwierzytelniania Zoho, które do uwierzytelniania wielopoziomowego wykorzystywały głównie hasła i klucze bezpieczeństwa FIDO, wymagały innych metod przechowywania niż klucze dostępu, które są oparte na kryptograficznych kluczach publicznych. Aby rozwiązać ten problem, firma Zoho wdrożyła nowy schemat bazy danych zaprojektowany specjalnie do bezpiecznego przechowywania kluczy publicznych kluczy dostępu i powiązanych danych zgodnie z protokołami WebAuthn. Nowy system został opracowany wraz z mechanizmem wyszukiwania, który umożliwia weryfikowanie i pobieranie danych logowania na podstawie informacji o użytkowniku i urządzeniu, co zapewnia zgodność wsteczną ze starszymi metodami uwierzytelniania.

Kolejna zmiana po stronie serwera polegała na wdrożeniu możliwości obsługi żądań z urządzeń z Androidem. Żądania kluczy dostępu pochodzące z aplikacji na Androida używają unikalnego formatu pochodzenia (android:apk-key-hash:example), który różni się od standardowych źródeł internetowych używających formatu opartego na URI (https://example.com/app). Logikę serwera należało zaktualizować, aby prawidłowo analizować ten format, wyodrębniać skrót odcisku cyfrowego SHA-256 certyfikatu podpisywania aplikacji i weryfikować go na podstawie wstępnie zarejestrowanej listy. Ten krok weryfikacji zapewnia, że żądania uwierzytelnienia rzeczywiście pochodzą z aplikacji Zoho na Androida, i chroni przed atakami typu phishing.

Ten fragment kodu pokazuje, jak serwer sprawdza format pochodzenia specyficzny dla Androida i weryfikuje skrót certyfikatu:

val origin: String = clientData.getString("origin")

if (origin.startsWith("android:apk-key-hash:")) { 
    val originSplit: List<String> = origin.split(":")
    if (originSplit.size > 3) {
               val androidOriginHashDecoded: ByteArray = Base64.getDecoder().decode(originSplit[3])

                if (!androidOriginHashDecoded.contentEquals(oneAuthSha256FingerPrint)) {
            throw IAMException(IAMErrorCode.WEBAUTH003)
        }
    } else {
        // Optional: Handle the case where the origin string is malformed    }
}

Obsługa błędów

Firma Zoho wdrożyła solidne mechanizmy obsługi błędów, aby zarządzać błędami widocznymi dla użytkowników i deweloperów. Gdy użytkownicy ręcznie anulowali konfigurację klucza dostępu, pojawiał się typowy błąd CreateCredentialCancellationException. Firma Zoho śledziła częstotliwość występowania tego błędu, aby ocenić potencjalne ulepszenia interfejsu. Zgodnie z rekomendacjami dotyczącymi wygody korzystania z interfejsu na Androidzie firma Zoho podjęła działania, aby lepiej informować użytkowników o kluczach dostępu, upewnić się, że wiedzą o ich dostępności, i zachęcać do korzystania z nich podczas kolejnych prób logowania.

Ten przykład kodu pokazuje podejście Zoho do obsługi najczęstszych błędów tworzenia kluczy dostępu:

private fun handleFailure(e: CreateCredentialException) {
    val msg = when (e) {
        is CreateCredentialCancellationException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_CANCELLED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "The operation was canceled by the user."
        }
        is CreateCredentialInterruptedException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_INTERRUPTED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Passkey setup was interrupted. Please try again."
        }
        is CreateCredentialProviderConfigurationException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_PROVIDER_MISCONFIGURED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Credential provider misconfigured. Contact support."
        }
        is CreateCredentialUnknownException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_UNKNOWN_ERROR", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "An unknown error occurred during Passkey setup."
        }
        is CreatePublicKeyCredentialDomException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_WEB_AUTHN_ERROR", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Passkey creation failed: ${e.domError}"
        }
        else -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_FAILED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "An unexpected error occurred. Please try again."
        }
    }
}

Testowanie kluczy dostępu w środowiskach intranetowych

Firma Zoho napotkała początkowe trudności z testowaniem kluczy dostępu w zamkniętym środowisku intranetowym. Proces weryfikacji Menedżera haseł Google w przypadku kluczy dostępu wymaga publicznego dostępu do domeny w celu zweryfikowania domeny podmiotu polegającego na uwierzytelnianiu (RP). Jednak wewnętrzne środowisko testowe Zoho nie miało dostępu do publicznego internetu, co spowodowało niepowodzenie procesu weryfikacji i utrudniło przeprowadzenie testów uwierzytelniania za pomocą klucza dostępu. Aby temu zapobiec, firma Zoho utworzyła publicznie dostępne środowisko testowe, które obejmowało hostowanie tymczasowego serwera z plikiem linku do komponentu i weryfikację domeny.

Ten przykład z pliku assetlinks.json używanego w publicznym środowisku testowym Zoho pokazuje, jak powiązać domenę podmiotu ufającego z określoną aplikacją na Androida na potrzeby weryfikacji klucza dostępu.

[
    {
        "relation": [
            "delegate_permission/common.handle_all_urls",
            "delegate_permission/common.get_login_creds"
        ],
        "target": {
            "namespace": "android_app",
            "package_name": "com.zoho.accounts.oneauth",
            "sha256_cert_fingerprints": [
                "SHA_HEX_VALUE" 
            ]
        }
    }
]

Integracja z istniejącym serwerem FIDO

System kluczy dostępu na Androidzie korzysta z nowoczesnego standardu FIDO2 WebAuthn. Ten standard wymaga żądań w określonym formacie JSON, co pomaga zachować spójność między aplikacjami natywnymi a platformami internetowymi. Aby włączyć obsługę kluczy dostępu na Androidzie, Zoho wprowadził niewielkie zmiany w zakresie zgodności i struktury, aby prawidłowo generować i przetwarzać żądania zgodne z wymaganą strukturą JSON protokołu FIDO2.

Aktualizacja serwera obejmowała kilka konkretnych zmian technicznych:

1. Konwersja kodowania: serwer przekształca kodowanie Base64 URL (powszechnie używane w WebAuthn w przypadku pól takich jak identyfikatory danych logowania) na standardowe kodowanie Base64, zanim zapisze odpowiednie dane. Poniższy fragment kodu pokazuje, jak zakodować identyfikator rawId w standardzie Base64:

// Convert rawId bytes to a standard Base64 encoded string for storage
val base64RawId: String = Base64.getEncoder().encodeToString(rawId.toByteArray())

2. Format listy transportu: aby zapewnić spójne przetwarzanie danych, logika serwera obsługuje listy mechanizmów transportu (takich jak USB, NFC i Bluetooth, które określają sposób komunikacji uwierzytelniania) jako tablice JSON.

3. Dopasowanie danych klienta: zespół Zoho dostosował sposób kodowania i dekodowania pola clientDataJson przez serwer. Dzięki temu struktura danych jest dokładnie zgodna z oczekiwaniami dotyczącymi istniejących wewnętrznych interfejsów API Zoho. Poniższy przykład ilustruje część logiki konwersji stosowanej do danych klienta przed ich przetworzeniem przez serwer:

private fun convertForServer(type: String): String {
    val clientDataBytes = BaseEncoding.base64().decode(type)
    val clientDataJson = JSONObject(String(clientDataBytes, StandardCharsets.UTF_8))
    val clientJson = JSONObject()
    val challengeFromJson = clientDataJson.getString("challenge")
    // 'challenge' is a technical identifier/token, not localizable text.
    clientJson.put("challenge", BaseEncoding.base64Url()
        .encode(challengeFromJson.toByteArray(StandardCharsets.UTF_8))) 

    clientJson.put("origin", clientDataJson.getString("origin"))
    clientJson.put("type", clientDataJson.getString("type"))
    clientJson.put("androidPackageName", clientDataJson.getString("androidPackageName"))
    return BaseEncoding.base64().encode(clientJson.toString().toByteArray())
}

Wskazówki dla użytkowników i ustawienia uwierzytelniania

Kluczowym elementem strategii Zoho dotyczącej kluczy dostępu było zachęcanie użytkowników do ich stosowania przy jednoczesnym zapewnieniu elastyczności, która pozwala dostosować się do różnych wymagań organizacji. Udało się to osiągnąć dzięki starannemu projektowi interfejsu i kontroli zasad.

Firma Zoho zdaje sobie sprawę, że organizacje mają różne potrzeby w zakresie bezpieczeństwa. Aby to umożliwić, Zoho wdrożyło:

  • Wymuszanie przez administratora: w panelu administracyjnym Zoho Directory administratorzy mogą wyznaczyć klucze dostępu jako obowiązkową, domyślną metodę uwierzytelniania w całej organizacji. Gdy ta zasada jest włączona, pracownicy muszą skonfigurować klucz dostępu przy następnym logowaniu i używać go w przyszłości.
  • Wybór użytkownika: jeśli organizacja nie wymusza stosowania konkretnej zasady, kontrolę zachowują poszczególni użytkownicy. Podczas logowania mogą wybrać preferowaną metodę uwierzytelniania, wybierając klucze dostępu lub inne skonfigurowane opcje w ustawieniach uwierzytelniania.

Aby zachęcić użytkowników do korzystania z kluczy dostępu i ułatwić im to, firma Zoho wdrożyła:

  • Łatwa konfiguracja: Zoho zintegrowało konfigurację klucza dostępu bezpośrednio z aplikacją mobilną Zoho OneAuth (dostępną zarówno na Androida, jak i na iOS). Użytkownicy mogą w dowolnym momencie wygodnie skonfigurować klucze dostępu w aplikacji, co ułatwia przejście na tę metodę.
  • Spójny dostęp: obsługa kluczy dostępu została wdrożona w kluczowych punktach styczności z użytkownikiem, dzięki czemu użytkownicy mogą rejestrować się i uwierzytelniać za pomocą kluczy dostępu w tych miejscach:
  • aplikacja mobilna Zoho OneAuth (Android i iOS);
  • stronie kont Zoho w przeglądarce;

Dzięki temu proces konfigurowania i używania kluczy dostępu był dostępny i zintegrowany z platformami, z których użytkownicy już korzystali, niezależnie od tego, czy został on narzucony przez administratora, czy wybrany przez użytkownika. Więcej informacji o tworzeniu płynnych ścieżek użytkownika na potrzeby uwierzytelniania za pomocą klucza dostępu znajdziesz w naszym kompleksowym przewodniku dotyczącym wrażeń użytkowników kluczy dostępu.

Wpływ na szybkość pracy programistów i wydajność integracji

Credential Manager jako ujednolicony interfejs API pomógł też zwiększyć produktywność deweloperów w porównaniu ze starszymi procesami logowania. Uprościło to obsługę wielu metod uwierzytelniania i interfejsów API, co przyspieszyło integrację z miesięcy do tygodni i zmniejszyło liczbę błędów implementacji. Uprościło to proces logowania i zwiększyło ogólną niezawodność.

Dzięki wdrożeniu kluczy dostępu za pomocą Menedżera danych logowania firma Zoho osiągnęła znaczącą, wymierną poprawę w każdym obszarze:

  • Znaczne zwiększenie szybkości
    • Logowanie jest 2 razy szybsze niż w przypadku tradycyjnego uwierzytelniania za pomocą hasła.
    • Logowanie jest 4 razy szybsze niż w przypadku logowania za pomocą nazwy użytkownika lub numeru telefonu z uwierzytelnianiem za pomocą hasła jednorazowego wysyłanego e-mailem lub SMS-em.
    • Logowanie jest 6 razy szybsze niż w przypadku uwierzytelniania za pomocą nazwy użytkownika, hasła oraz hasła jednorazowego z SMS-a lub aplikacji uwierzytelniającej.
  • Niższe koszty pomocy
    • Mniejsza liczba próśb o pomoc związanych z hasłami, zwłaszcza w przypadku zapomnianych haseł.
    • Niższe koszty związane z uwierzytelnianiem dwuskładnikowym opartym na SMS-ach, ponieważ obecni użytkownicy mogą bezpośrednio przejść na klucze dostępu.
  • Wysoka adopcja przez użytkowników i większe bezpieczeństwo:
    • Liczba logowań za pomocą kluczy dostępu podwoiła się w ciągu zaledwie 4 miesięcy, co świadczy o dużej akceptacji tej metody przez użytkowników.
    • Użytkownicy, którzy przejdą na klucze dostępu, będą w pełni chronieni przed typowymi zagrożeniami związanymi z phishingiem i ujawnieniem haseł.
    • Wzrost liczby użytkowników o 31% w ujęciu miesięcznym oznacza, że coraz więcej osób korzysta z lepszej ochrony przed zagrożeniami, takimi jak wyłudzanie informacji czy wymiana karty SIM.

rekomendacje i sprawdzone metody

Aby prawidłowo wdrożyć klucze dostępu na Androidzie, deweloperzy powinni stosować te sprawdzone metody:

  • Korzystaj z interfejsu Credential Manager API na Androidzie:
    • Credential Manager upraszcza pobieranie danych logowania, zmniejszając nakład pracy programistów i zapewniając ujednolicone uwierzytelnianie.
    • Obsługuje hasła, klucze dostępu i przepływy logowania federacyjnego w jednym interfejsie.
  • Zapewnij spójność kodowania danych podczas migracji z innych rozwiązań uwierzytelniania FIDO:
    • Podczas migracji z innych rozwiązań uwierzytelniania FIDO, takich jak klucze bezpieczeństwa FIDO, zadbaj o spójne formatowanie wszystkich danych wejściowych i wyjściowych.
  • Zoptymalizuj obsługę błędów i logowanie:
    • Wdróż solidną obsługę błędów, aby zapewnić użytkownikom bezproblemową obsługę.
    • Wyświetlaj zlokalizowane komunikaty o błędach i korzystaj ze szczegółowych logów, aby debugować i rozwiązywać nieoczekiwane problemy.
  • Poinformuj użytkowników o opcjach odzyskiwania klucza dostępu:
    • Zapobiegaj sytuacjom, w których użytkownicy nie mogą się zalogować, poprzez proaktywne informowanie ich o opcjach odzyskiwania.
  • Monitorowanie danych dotyczących wdrożenia i opinii użytkowników:
    • Śledź zaangażowanie użytkowników, wskaźniki wdrożenia kluczy dostępu i wskaźniki skuteczności logowania, aby stale optymalizować wrażenia użytkowników.
    • Przeprowadzaj testy A/B różnych procesów uwierzytelniania, aby zwiększyć liczbę konwersji i utrzymanych użytkowników.

Klucze dostępu w połączeniu z interfejsem Android Credential Manager API stanowią zaawansowane, ujednolicone rozwiązanie do uwierzytelniania, które zwiększa bezpieczeństwo i ułatwia korzystanie z usług. Klucze dostępu znacznie zmniejszają ryzyko wyłudzania informacji, kradzieży danych logowania i nieautoryzowanego dostępu. Zachęcamy deweloperów do wypróbowania tej funkcji w swoich aplikacjach i zapewnienia użytkownikom najbezpieczniejszego uwierzytelniania.

Pierwsze kroki z kluczami dostępu i Menedżerem danych logowania

Wypróbuj klucze dostępu i usługę Credential Manager na Androidzie, korzystając z naszego publicznego kodu przykładowego.

Jeśli masz pytania lub problemy, możesz je zgłosić w narzędziu do śledzenia problemów z danymi logowania na Androida.

Autor:

Czytaj dalej