2014-03-14 47 views
2

我想在我的android應用程序中實現OTP功能。 在此應用程序中,註冊用戶將收到一次性密碼密鑰。在接收到OTP後,用戶將能夠使用該OTP成功開立帳戶。我需要做什麼來實現這一目標?Android一次性密碼(OTP)

+1

請谷歌,也有對這個 – iec2011007

回答

4
+0

可用噸的資源能否請您就如何使客戶端幫助和服務器使用谷歌aunthticator.There沒有提供的文件。 –

+0

您可以從這個實現中檢查RFC的實現示例https://tools.ietf.org/html/rfc6238#appendix-A,您只需要在客戶端和服務器上生成一次性密碼(兩側同樣的過程)。 –

10

源代碼,我實現一個非常簡單的方法OTP ..

  1. 活動會生成一個隨機的5位數字並通過短信網關發送給手機號碼。
  2. 收到短信,SMS正文由Broadcast Reciever讀取,並將SMS主體中的代碼複製到OTP EditText。
  3. 如果通過短信發送的活動和代碼生成的隨機代碼相同,則用戶應該進一步訪問。
+0

你能分享我們的代碼或你的github鏈接爲你的代碼 –

+0

分享你的代碼.. – sri

+0

你可以分享你的代碼,請我面臨問題 - https://github.com/rajatbeck/LoginWithOTP/issues/1 原代碼服務器端 - http://www.androidhive.info/2015/08/android-adding-sms-verification-like-whatsapp-part-1/ 和我的應用程序代碼 - http://www.androidhive.info/2015/08/Android系統的加入,手機短信驗證樣的WhatsApp部分-2 /#評論-2990831653 – SameerKhan1406

0

正如@Vipin提到的,最好的辦法就是實現它你的自我:

首先,你必須生成一個4位數字(或任何你想要的)PIN碼,例如:

int range = 9; // to generate a single number with this range, by default its 0..9 
int length = 4; // by default length is 4 

public int generateRandomNumber() { 
    int randomNumber; 

    SecureRandom secureRandom = new SecureRandom(); 
    String s = ""; 
    for (int i = 0; i < length; i++) { 
     int number = secureRandom.nextInt(range); 
     if (number == 0 && i == 0) { // to prevent the Zero to be the first number as then it will reduce the length of generated pin to three or even more if the second or third number came as zeros 
      i = -1; 
      continue; 
     } 
     s = s + number; 
    } 

    randomNumber = Integer.parseInt(s); 

    return randomNumber; 
} 

然後,你必須保存這個號碼保存在某個地方,例如在你的喜好:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
SharedPreferences.Editor editor = preferences.edit(); 
editor.putInt("OTP_PIN", randomNumber); 
editor.commit(); 

下一步,將使用適當的SMS網關發送動態密碼傳送至相應的電話號碼,對我來說我使用clickATell與我們的PHP服務器發送消息,該api documentation是相當清楚的。如果你想直接從應用程序發送消息,可能是SMSgateway可以提供幫助。

最後一步,是驗證通過短信收到的代碼是一個存儲設備的偏好,這是很簡單,直接的,所有你需要做的是爲用戶提供允許他提供EditText輸入他的手機收到的代碼,如果代碼與設備首選項中保存的OTP相匹配,請讓他通過該應用程序,否則顯示正確的錯誤消息。


一個優雅的舉動: 不是強制性的,但最好,因爲有很多的應用程序做,你可以提供短信聽衆收聽即將到來的消息,從接收到的信息獲取的代碼,在代碼中顯示它驗證editText,驗證它是否爲真,通過應用程序。

in manifest。XML

<receiver 
    android:name=".Services.SmsListener" 
    android:exported="true" 
    android:permission="android.permission.BROADCAST_SMS"> 
    <intent-filter android:priority="999"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

聽衆:

public class SmsListener extends BroadcastReceiver { 

    @TargetApi(Build.VERSION_CODES.KITKAT) 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("messageBody", intent.getAction()); 
     if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) { 
      try { 
       String messageBody = ""; 
       for (SmsMessage smsMessage : Telephony.Sms.Intents.getMessagesFromIntent(intent)) { 
        messageBody = smsMessage.getMessageBody(); 
       } 
       Intent messageReceived = new Intent(SVPreferences.SMS_RECEIVED); 
       messageReceived.putExtra("sms", messageBody); 
       context.sendBroadcast(messageReceived); // when receiving it somewhere in your app, subString the additional text and leave only the code, then place it in the editText and do your verification 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
} 

接收器:

BroadcastReceiver receiveSMS = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     try { 
      String smsBody = intent.getStringExtra("sms"); 
      String pin = smsBody.replace(getResources().getString(R.string.your_extra_text), "").trim(); 
      editText_confirm_pin.setText(pin); 
      if (validatePin(pin)) 
       // go through the app 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
};