web-dev-qa-db-ja.com

Androidワンタイムパスワード(OTP)ユーザー登録/開設アカウント

AndroidアプリケーションにOTP機能を実装したい。このアプリケーションでは、サインアップ後ユーザーはワンタイムパスワードキーを受け取ります。 OTPの確認の後、ユーザーはそのOTPを使用してアカウントの登録/オープンに成功できるようになります。これを達成するために何をする必要がありますか?

8
sachin110011

Googleオーセンティケーターを確認してください。 https://code.google.com/p/google-authenticator/ OTP機能を備えたオープンソースプロジェクト

Android app https://code.google.com/p/google-authenticator/source/browse/?repo=Android のソースコード

サーバー側のソースコードは次のとおりです https://github.com/chregu/GoogleAuthenticator.php

ウィキペディアの記事 http://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm

8
Sergey Pekar

私はOTPの非常に単純な方法を実装しています。

  1. アクティビティはランダムな5桁の番号を生成し、SMSゲートウェイを介して携帯電話番号に送信します。
  2. SMSを受信したら、SMSブロードキャストレシーバーが本文を読み取り、コードをSMS本体からOTP EditTextにコピーします。
  3. アクティビティによって生成されたランダムコードとSMS経由で送信されたコードが同じ場合、ユーザーはさらにアクセスできるはずです。
11
Vipin Sharma

@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ゲートウェイを使用して、OTPを対応する電話番号に送信します。私は clickATell をphpサーバーで使用してメッセージを送信していますが、- api documentation はかなり明確です。アプリケーションから直接メッセージを送信する場合は、 SMSgateway が役立ちます。

最後のステップは、SMSが受信したコードをデバイスプリファレンスに保存されているものであり、これはかなり簡単で簡単です。ユーザーがEditTextを提供して、電話で受信したコードを入力できるようにするだけです。コードがデバイス設定に保存されているOTPと一致する場合は、それ以外の場合は、適切なエラーメッセージを表示します。


上品な動き:必須ではありませんが、多くのアプリケーションでSMS listen to listen次のメッセージ、受信したメッセージからコードを取得、コード検証に表示editText、それを検証し、trueの場合はアプリを実行します。

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();
        }
    }
};
3
Muhammed Refaat