Weryfikacja SMS na serwerze

Aby automatycznie weryfikować numery telefonów, musisz wdrożyć etap weryfikacji obejmujący klient i serwer. W tym dokumencie opisujemy, jak wdrożyć część związaną z serwerem.

Serwer weryfikacji telefonicznej jest odpowiedzialny za 3 działania:

  1. Utworzenie wiadomości weryfikacyjnej zawierającej jednorazowy kod w formacie, którego oczekuje się od interfejsu SMS Retriever API po stronie klienta.
  2. Wysyłanie wiadomości weryfikacyjnej na urządzenie użytkownika
  3. Weryfikowanie kodu jednorazowego, gdy jest on odsyłany z powrotem na serwer i wykonywanie zadań po weryfikacji, których wymaga Twój backend.

Szczegóły interakcji aplikacji z serwerem zależą od Ciebie. Typowym sposobem jest udostępnianie interfejsu API REST z 2 punktami końcowymi: jeden do odbierania żądań weryfikacji danego numeru telefonu i wysyłanie SMS-ów weryfikacyjnych oraz drugi punkt końcowy, który odbiera jednorazowe kody z Twojej aplikacji.

1. Tworzenie wiadomości weryfikacyjnej

Gdy serwer otrzymuje żądanie weryfikacji numeru telefonu, najpierw utwórz wiadomość weryfikacyjną, którą wyślesz na urządzenie użytkownika. Ta wiadomość musi:

W przeciwnym razie możesz wybrać dowolną treść wiadomości weryfikacyjnej. Warto utworzyć wiadomość, z której będzie można później łatwo wyodrębnić jednorazowy kod. Prawidłowa wiadomość weryfikacyjna może na przykład wyglądać tak:

Your ExampleApp code is: 123ABC78

FA+9qCX9VSu

Generowanie jednorazowego kodu

Jednorazowe kody można zaimplementować na wiele sposobów, o ile nie da się ich rozszyfrować, a potem połączyć je z użytkownikiem lub numerem telefonu, gdy aplikacja kliencka odsyła je na serwer. Kody powinny być łatwe do wpisania, aby umożliwić obsługę w sytuacjach, w których użytkownicy mogą ręcznie wpisywać kod.

Jednym ze sposobów implementacji kodów jednorazowych jest generowanie liczb losowych, których możesz używać jako kluczy w tabeli bazy danych. Możesz np. mieć tabelę PendingWeryfikacjas podobna do tej:

Identyfikator Użytkownik Wygaśnięcie
123456789... 1234 14.03.2017 1:59

Identyfikatora zakodowanego w formacie base32 możesz użyć jako kodu jednorazowego.

Obliczanie ciągu skrótu Twojej aplikacji

Usługi Google Play używają ciągu skrótu, aby określić, które wiadomości weryfikacyjne wysłać do Twojej aplikacji. Ciąg skrótu składa się z nazwy pakietu aplikacji i certyfikatu klucza publicznego aplikacji. Aby wygenerować ciąg skrótu:

  1. Jeśli korzystasz z podpisywania aplikacji przez Google Play, pobierz certyfikat podpisywania aplikacji (deployment_cert.der) z sekcji Podpisywanie aplikacji w Konsoli Google Play.

    Następnie zaimportuj certyfikat podpisywania aplikacji do tymczasowego magazynu kluczy:

    keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
    

    Jeśli podpisujesz pliki APK bezpośrednio, pomiń ten krok.

  2. Pobierz certyfikat podpisywania aplikacji (zaimportowany powyżej lub ten, którego używasz do bezpośredniego podpisywania plików APK) w postaci ciągu szesnastkowego pisanego małymi literami.

    Aby na przykład pobrać ciąg szesnastkowy z utworzonego powyżej tymczasowego magazynu kluczy, wpisz to polecenie:

    keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
    

    Jeśli podpisujesz pliki APK bezpośrednio, podaj produkcyjny magazyn kluczy i alias certyfikatu.

  3. Jeśli masz utworzony tymczasowy magazyn kluczy, usuń go.

  4. Dodaj ciąg szesnastkowy do nazwy pakietu aplikacji i rozdziel go pojedynczym spacją.

  5. Oblicz sumę wartości SHA-256 połączonego ciągu znaków. Pamiętaj, aby przed obliczeniem sumy SHA-256 usunąć z ciągu znaków odstępy na początku i na końcu ciągu znaków.

  6. Zakoduj wartość binarną sumy SHA-256 za pomocą kodowania Base64. Być może konieczne będzie najpierw zdekodowanie sumy SHA-256 z formatu wyjściowego.

  7. Ciąg znaków skrótu Twojej aplikacji to pierwsze 11 znaków skrótu zakodowanego w formacie base64.

To polecenie oblicza ciąg znaków skrótu z produkcyjnego magazynu kluczy aplikacji:

keytool -exportcert -alias PlayDeploymentCert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

Ciąg znaków skrótu swojej aplikacji możesz też pobrać za pomocą klasy AppSignatureHelper z przykładowej aplikacji SMS retriever. Jeśli jednak używasz klasy pomocniczej, pamiętaj, aby usunąć ją z aplikacji po otrzymaniu ciągu znaków. Nie używaj ciągów skrótów dynamicznie generowanych po stronie klienta w wiadomościach weryfikacyjnych.

2. Wyślij wiadomość weryfikacyjną SMS-em

Po utworzeniu wiadomości weryfikacyjnej wyślij ją na numer telefonu użytkownika, korzystając z dowolnego systemu SMS.

W witrynie dla deweloperów Twilio przeczytaj np. o weryfikacji aplikacji przy użyciu Twilio SMS.

Gdy urządzenie użytkownika otrzyma tę wiadomość, zostanie ona przekierowana do Twojej aplikacji. Aplikacja wyodrębnia jednorazowy kod i wysyła go z powrotem na serwer w celu zakończenia procesu weryfikacji.

3. Zweryfikuj zwrócony kod jednorazowy

Serwer weryfikacji numeru telefonu ma zwykle drugi punkt końcowy, za pomocą którego może odbierać jednorazowe kody z aplikacji klienckich. Gdy serwer otrzyma w tym punkcie końcowym jednorazowy kod z aplikacji, wykonaj te czynności:

  1. Sprawdź, czy jednorazowy kod jest prawidłowy i nie stracił ważności.
  2. Zarejestruj, że użytkownik powiązany z danym kodem jednorazowym przeszedł weryfikację numeru telefonu.
  3. Usuń rekord bazy danych jednorazowego kodu lub w inny sposób zablokuj możliwość ponownego użycia tego samego kodu.

Gdy zarejestrujesz stan weryfikacji użytkownika i usuniesz z bazy danych jednorazowy kod, weryfikacja zostanie zakończona.