2013-01-17 21 views
6

मुझे यह सत्यापित करने का एक तरीका चाहिए कि मेरे एंड्रॉइड एप्लिकेशन में सेट किया गया मोबाइल नंबर "स्वामित्व" के रूप में सही है - मोबाइल नंबर की डेटा सत्यापन नहीं।एंड्रॉइड फोन नंबर सत्यापन

उदा। जिस तरह से व्हाट्सएप यह कर रहा है ...

मुझे पता है कि कोड और सामान का उपयोग करके एसएमएस सत्यापन द्वारा यह कैसे किया जा सकता है। बात यह है कि यह एक नि: शुल्क एंड्रॉइड ऐप है और ऐप मुफ्त होने पर मैं प्रत्येक भेजे गए एसएमएस के लिए भुगतान करने के इच्छुक नहीं हूं। खराब व्यापार मॉडल ...

क्या यह सुरक्षित और नि: शुल्क करने का कोई तरीका है?

एपीआई कोड का उपयोग करना है, तो यह एक विकल्प मुझे डर लग रहा है भी सुरक्षित नहीं होने लगते हैं:

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

क्या आप मतलब है कि यह "सुरक्षित नहीं" है? – Tushar

+0

मुझे नहीं पता कि व्हाट्सएप कैसे करता है, और शायद यहां दूसरों को भी पता नहीं है। शायद आप हमें सुराग दे सकते हैं? –

+1

दरअसल, मेरे अनुभव में व्हाट्सएप * खाता निर्माण पर एक एसएमएस सत्यापन भेजता है। – kabuko

उत्तर

19

WhatsApp आप के लिए किसी भी एसएमएस नहीं भेजा है, यह एक एसएमएस अपने खुद के मोबाइल फोन के साथ करने के लिए भेजता आपका खुद का नंबर अगर आपको एसएमएस मिल जाता है तो सबकुछ ठीक है, अगर आपको एसएमएस नहीं मिलता है तो आपके पास उस नंबर का स्वामित्व नहीं है। यह जांचने का एकमात्र सस्ता और आसान तरीका है कि उपयोगकर्ता ने अपने वास्तविक नंबर के साथ साइन अप किया है या नहीं। फोन चयनकर्ता और एसएमएस कुत्ता:

+0

इसका मतलब यह है कि उपयोगकर्ता एक ही एसएमएस के लिए भुगतान करना पड़ता है कि? इस समाधान के साथ कोई ज्ञात कमी? – andreas78

+0

हाँ यह सही है। मुझे इस समाधान के लिए कोई नुकसान नहीं पता – ObAt

+0

मैंने इस पर थोड़ा सा पढ़ा है और यह बहुत सुरक्षित नहीं है। ऐसा लगता है जैसे व्हाट्सएप अपनी पंजीकरण प्रक्रिया असुरक्षित होने के साथ संघर्ष कर रहा है। फ़ोन नंबर के मालिक होने का नाटक करने की क्षमता के कई उदाहरण। : -/ – andreas78

1

Google Play सेवाओं दो नए एपीआई की मदद से आप एक उपयोगकर्ता के फोन नंबर प्राप्त करने और बिना उपकरण अनुमतियों एसएमएस के माध्यम से इसे सत्यापित किया है।

फोन चयनकर्ता का उपयोग संख्या

पहला कदम उपयोगकर्ता है प्राप्त करने के लिए अपने ऐप्लिकेशन के भीतर से SMS सत्यापन आरंभ करें। आपके ऐप के लिए फोन नंबर दर्ज करने के लिए संकेत हो सकता है, और आप इस आसान बनाने के लिए फोन का भी उपयोग करेंगे, इस तरह कोड का उपयोग:

// 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 बिल्डर बताता Play सेवाओं है कि एक फोन नंबर पहचानकर्ता जरूरत है। इसका उपयोग तब एक इरादा बनाने और शुरू करने के लिए किया जाता है, जो उपयोगकर्ता को Play सेवा संवाद दिखाएगा, जिससे उन्हें ऐप के साथ साझा करने के लिए अपने फोन नंबर का चयन करने की अनुमति मिलती है। यह API को किसी भी अनुमति की आवश्यकता नहीं है, और उपयोगकर्ता को चुनने के लिए फ़ोन या Google खाते पर उपलब्ध संख्या प्रदर्शित करता है।

जब उपयोगकर्ता कोई फ़ोन नंबर चुनता है तो उसे पर चलाने वाली डिवाइसों पर E164 प्रारूप में एक्टिविटी रिसेट में वापस चलाया जाएगा। ध्यान दें कि कुछ मामलों में, आपके फोन पर निर्भर करता है, तो आपको फ़ोन नंबर नहीं मिल सकता है, इसलिए यह सुनिश्चित करना सुनिश्चित करें कि प्रमाण-पत्र गैर-शून्य है या नहीं। यदि आपके पास कोई संख्या नहीं है, तो आपको को अपने उपयोगकर्ता को मैन्युअल रूप से टाइप करने का एक तरीका प्रदान करना होगा।

// 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 
     } 
    } 
} 

इस बिंदु पर आप अपने उपयोगकर्ता के लिए एक फोन नंबर स्ट्रिंग होगा। जबकि यह उपयोगी है, आप शायद यह सत्यापित करना चाहते हैं कि उपयोगकर्ता इस विशिष्ट संख्या का मालिक है, उदाहरण के लिए उन्हें अन्य उपयोगकर्ताओं के साथ संदेश भेजने या पुनर्प्राप्त करने या इस नंबर के साथ स्वयं को पहचानने की अनुमति देने के लिए।

संख्या

फोन नंबर स्वामित्व को सत्यापित करने के लिए एक आसान तरीका सत्यापित करने के लिए SMS सत्यापन API का उपयोग करके नंबर, के लिए एक एसएमएस भेजने के लिए एक बार सत्यापन कोड के साथ, और उन्हें होने से है में प्रवेश कि अपने ऐप में एसएमएस सत्यापन API आपको ऐप के आने वाले एसएमएस को सुनने की क्षमता देता है, जिससे स्वचालित रूप से कोड को पार्स कर सकता है।

आरंभ करने के लिए, अपने अनुप्रयोग इस तरह कोड के साथ SmsRetrieverClient देगा:

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) { 
    }); 
); 

यह बहुत सरल है - आप एक एसएमएस कुत्ता ग्राहक पाने के लिए और फिर इसके लिए एक काम शुरू करते हैं। कार्य में सफल श्रोता के साथ-साथ पर एक ओवरराइड करने में विफलता है। एसएमएस रेट्रिवर शुरू करने के बाद, आप उपयोगकर्ता के फोन नंबर को अपने सर्वर पर भेज देंगे और के लिए यह वर्कफ़्लो प्रारंभ करेंगे और उसे उस नंबर पर भेज देगा।

संदेश एक विशिष्ट तरीके से निर्माण किया जाना चाहिए। संदेश को एक एसएमएस संदेश में फिट होना चाहिए, इसलिए यह 140 बाइट से अधिक नहीं हो सकता है। लगातार दो शून्य चौड़ाई स्थान वर्ण (U + 200B) '< #>' या: यह कोई विशिष्ट प्रारंभिक से प्रारंभ करना होगा। के लिए documentation देखें और अधिक जानकारी। इसे 11-वर्ण हैश के साथ समाप्त होना चाहिए कि नीचे वर्णित आपके ऐप की पहचान करता है।

उदाहरण:

< #> उदाहरण App में अपना सत्यापन कोड के रूप में 123456 का प्रयोग करें!

एफए + 9qCX9VSu

एक बार सत्यापन कोड कोई भी स्ट्रिंग हो सकते हैं: आप बस एक यादृच्छिक संख्या उत्पन्न कर सकते हैं। संदेश को हैश के साथ समाप्त करने की आवश्यकता है जो प्रक्रियाओं के अनुसार निर्धारित है। Google Play सेवाएं इस हैश का उपयोग यह निर्धारित करने के लिए करें कि सत्यापन संदेश किस ऐप के लिए है। आप केवल अपने ऐप का पैकेज और पर हस्ताक्षर प्रमाण पत्र के लिए एक बार इस हैश उत्पन्न करने के लिए की जरूरत है: यह नहीं बदलेगा और ग्राहक एप्लिकेशन द्वारा नहीं आपूर्ति की जानी चाहिए।

आपका सर्वर फिर अपने मौजूदा एसएमएस बुनियादी ढांचे या सेवा का उपयोग कर फोन करने के लिए संदेश भेज सकते हैं। जब यह संदेश प्राप्त होता है, तो Google Play सेवाएं किसी इरादे को प्रसारित करती हैं जिसमें संदेश का टेक्स्ट होता है। कोड यह रहा:

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; 
     } 
    } 
    } 
} 

प्रसारण रिसीवर आप एक्स्ट्रा कलाकार पाने के onReceive में, और वहाँ से स्थिति खींच। यदि स्थिति इंगित करती है कि संदेश सफलतापूर्वक प्राप्त हुआ था, तो आप अतिरिक्त संदेश से संदेश खींच सकते हैं। यहां से आप सत्यापन कोड को पार्स कर सकते हैं और फ़ोन नंबर स्वामित्व की पुष्टि करने के लिए इसे अपने सर्वर पर पर भेज सकते हैं।

संदर्भ: Effective phone number verification

संबंधित मुद्दे