2013-01-17 15 views
6

Potrzebuję sposobu, aby sprawdzić, czy numer telefonu komórkowego ustawiony w mojej aplikacji na Androida jest poprawny, tak jak w "właścicielu" - a nie sprawdzaniu poprawności numeru telefonu komórkowego.Weryfikacja numeru telefonu z Androidem

E.g. sposób, w jaki to robi WhatsApp ...

Wiem, jak można to zrobić przez weryfikację SMS za pomocą kodów i innych rzeczy. Chodzi o to, że jest to bezpłatna aplikacja na Androida i nie chcę płacić za każdy wysłany SMS, gdy aplikacja jest darmowa. Zły model biznesowy ...

Czy istnieje sposób, aby zrobić to bezpiecznie i bezpłatnie?

Używając kodu API wydaje się nie być zbyt bezpieczne, więc nie jest to opcja Obawiam:

TelephonyManager tMgr (TelephonyManager)mAppContext.getSystemService(Context.TELEPHONY_SERVICE); 
mPhoneNumber = tMgr.getLine1Number(); 
+0

Co masz na myśli mówiąc, że to "nie jest bezpieczne"? – Tushar

+0

Nie wiem jak to robi WhatsApp, a może inni też nie wiedzą. Może mógłbyś nas oszukać? –

+1

Właściwie, z mojego doświadczenia WhatsApp * nie * wysyła weryfikację SMS-em przy tworzeniu konta. – kabuko

Odpowiedz

19

WhatsApp nie wysłał żadnej wiadomości SMS do ciebie, wysyła SMS z własnego telefonu komórkowego do twój własny numer. Jeśli otrzymasz SMS-a, wszystko jest w porządku, jeśli nie otrzymasz SMS-a, nie jesteś jego właścicielem. Jest to jedyny tani i łatwy sposób sprawdzenia, czy użytkownik zarejestrował się przy użyciu rzeczywistego numeru.

+0

Oznacza to, że użytkownik musi zapłacić za pojedynczy SMS? Jakieś znane wady tego rozwiązania? – andreas78

+0

Tak, to prawda. Nie znam żadnych wad tego rozwiązania. – ObAt

+0

Przeczytałem trochę na ten temat i nie jest to zbyt bezpieczne. Wygląda na to, że firma WhatsApp borykała się z brakiem bezpieczeństwa podczas rejestracji. Kilka przykładów umiejętności udawania właściciela numeru telefonu. : -/ – andreas78

1

Usługi Google Play ma dwa nowe interfejsy API, które pomogą Ci uzyskać numer telefonu użytkownika i zweryfikować go za pośrednictwem wiadomości SMS bez uprawnień urządzenia: Selector telefon i SMS Retriever.

Używanie Selector telefonu, aby uzyskać numer

Pierwszym krokiem jest, aby użytkownik zainicjować weryfikację SMS z wewnątrz aplikacji. Twoja aplikacja może poprosi użytkownika o podanie telefonu numer, można użyć funkcji wyboru telefonu, aby to ułatwić, stosując kod tak:

// Construct a request for phone numbers and show the picker 
private void requestHint() { 
    HintRequest hintRequest = new HintRequest.Builder() 
      .setPhoneNumberIdentifierSupported(true) 
      .build(); 

    PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
      apiClient, hintRequest); 
    startIntentSenderForResult(intent.getIntentSender(), 
      RESOLVE_HINT, null, 0, 0, 0); 
} 

HintRequest budowniczy mówi Zagraj Usług że numer telefonu identyfikator jest potrzebne. To jest następnie używane do utworzenia i rozpoczęcia intencji, , która pokaże użytkownikowi okno dialogowe Usługi Play, pozwalając mu wybrać numer telefonu, który ma zostać udostępniony aplikacji. Ten interfejs API nie wymaga żadnych uprawnień i wyświetla numer (y) dostępny na telefonie lub koncie Google użytkownika, który użytkownik może wybrać.

Gdy użytkownik wybierze numer telefonu, zostanie on zwrócony do aplikacji w onActivityResult w formacie E164 na urządzeniach z najnowszą wersją Usług odtwarzania . Zauważ, że w niektórych przypadkach, w zależności od telefonu, możesz nie uzyskać numeru telefonu, więc upewnij się, że numer referencyjny ma wartość inną niż null. Jeśli nie masz numeru, musisz podać sposób, aby użytkownik mógł wpisać go ręcznie.

// Obtain the phone number from the result 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == RESOLVE_HINT) { 
     if (resultCode == RESULT_OK) { 
      Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY); 
      // credential.getId(); <-- E.164 format phone number on 10.2.+ devices 
     } 
    } 
} 

W tym momencie będziesz mieć numer telefonu dla swojego użytkownika. Chociaż jest to przydatne, prawdopodobnie będziesz chciał sprawdzić, czy użytkownik jest właścicielem tego numeru , na przykład, aby umożliwić mu wysyłanie lub pobieranie wiadomości z innymi użytkownikami lub identyfikowanie się z tym numerem.

Korzystanie z API weryfikacji SMS, aby sprawdzić numer

Prosty sposób, aby zweryfikować numer telefonu własność jest poprzez wysłanie wiadomości SMS do numer, zawierający kod weryfikacyjny jeden raz, a po nich wprowadzić że do swojej aplikacji. Interfejs API do weryfikacji SMS zapewnia możliwość sprawdzania przez aplikację przychodzącego SMS-a, z którego może automatycznie analizować kod.

Aby zacząć, aplikacja będzie SmsRetrieverClient z kodem tak:

SmsRetrieverClient client = SmsRetriever.getClient(this /* context */); 

Task<Void> task = client.startSmsRetriever(); 

task.addOnSuccessListener(new OnSuccessListener<Void>() { 
    @Override 
    public void onSuccess(Void aVoid) { 
    // successfully started an SMS Retriever for one SMS message 
    } 
}); 

task.addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(@NonNull Exception e) { 
    }); 
); 

To całkiem proste - masz klienta SMS Retriever, a następnie rozpocząć zadanie dla niego. Zadanie ma włączony detektor Success, a także jeden z nich: Niepowodzenie nadpisania. Po uruchomieniu programu SMS Retriever, wyślesz na swój serwer numer telefonu użytkownika i rozpoczniesz jego przepływ pracy dla generowania wiadomości i wysyłania jej na ten numer.

Wiadomość musi być skonstruowana w określony sposób. Wiadomość musi zmieścić się w wiadomości SMS, więc nie może być dłuższa niż 140 bajtów. Numer musi się zaczynać od określonego prefiksu: "< #>" lub dwóch kolejnych znaków o zerowej szerokości (U + 200B). Więcej informacji znajdziesz w documentation dla . Musi się zakończyć 11-znakowym hashem, który identyfikuje twoją aplikację, opisaną poniżej.

Przykład:

< #> Użyj 123456 jako kod weryfikacyjny w przykładzie aplikacji!

FA + 9qCX9VSu

jednorazową kod weryfikacyjny może być dowolny ciąg znaków: wystarczy wygenerować liczbę losową. Komunikat musi się kończyć haszem, który jest określony zgodnie z procedurami tutaj. Usługi Google Play będą korzystać z tego skrótu do określenia, dla której aplikacji ma nastąpić weryfikacja. Konieczne jest wygenerowanie tego skrótu tylko raz dla pakietu aplikacji i certyfikatu podpisu : to się nie zmieni i nie powinno być dostarczane przez aplikację kliencką .

Twój serwer może następnie wysłać wiadomość na telefon przy użyciu istniejącej infrastruktury lub usługi SMS o nazwie . Po odebraniu tej wiadomości usługi Google Play rozgłaszają intencję zawierającą tekst wiadomości o numerze . Oto kod:

public class MySMSBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
    if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) { 
     Bundle extras = intent.getExtras(); 
     Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS); 

     switch(status.getStatusCode()) { 
     case CommonStatusCodes.SUCCESS: 
      String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE); 
      break; 
     case CommonStatusCodes.TIMEOUT: 
      break; 
     } 
    } 
    } 
} 

W onReceive odbiornika transmisji można uzyskać dodatki i ciągnąć status stamtąd. Jeśli status wskazuje, że wiadomość została pomyślnie odebrana, możesz pobrać wiadomość z dodatków. Tutaj możesz zanalizować kod weryfikacyjny i odesłać go na swój serwer na numer , aby potwierdzić własność numeru telefonu.

referencyjny: Effective phone number verification

Powiązane problemy