AndroidアプリケーションにOTP機能を実装したい。このアプリケーションでは、サインアップ後ユーザーはワンタイムパスワードキーを受け取ります。 OTPの確認の後、ユーザーはそのOTPを使用してアカウントの登録/オープンに成功できるようになります。これを達成するために何をする必要がありますか?
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
私はOTPの非常に単純な方法を実装しています。
@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();
}
}
};