wake-up-neo.com

Android One Time Password (OTP) Benutzerregistrierung/Eröffnungskonto

Ich möchte OTP-Funktionalität in meiner Anwendung Android implementieren. In dieser Anwendung erhält nach der Anmeldung Benutzer einmaliger Kennwortschlüssel). Nach OTP-Überprüfung kann der Benutzer Konto erfolgreich registrieren/Konto eröffnen mithilfe dieses OTPs erstellen. Was muss ich tun, um das zu erreichen?

5
sachin110011

Überprüfen Sie den Google Authenticator. https://code.google.com/p/google-authenticator/ ist ein Open Source-Projekt mit OTP-Funktionalität

Quellcode für Android-App https://code.google.com/p/google-authenticator/source/browse/?repo=Android

Hier ist der Quellcode für die Serverseite https://github.com/chregu/GoogleAuthenticator.php

Wikipedia-Artikel http://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm

6
Sergey Pekar

Ich habe eine sehr einfache Methode von OTP implementiert.

  1. Aktivität generiert eine zufällige 5-stellige Nummer und sendet sie über SMS Gateway an die Mobilfunknummer.
  2. Beim Empfangen von SMS, SMS body von Broadcast Reciever gelesen und den Code von SMS body in OTP EditText kopieren.
  3. Wenn der durch Aktivität erzeugte Zufallscode und der per SMS gesendete Code identisch sind, sollte der Benutzer weiteren Zugriff erhalten.
10
Vipin Sharma

Wie @Vipin erwähnt hat, wäre der beste Weg, es selbst zu implementieren:

Zuerst müssen Sie einen vierstelligen PIN-Code (oder einen beliebigen anderen Code) generieren, z. B .:

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

Dann , musst du diese Nummer irgendwo speichern, zum Beispiel in deinen Einstellungen:

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

Der nächste Schritt , wäre ein richtiges SMS Gateway, um dieses OTP an die entsprechende Telefonnummer zu senden. Für mich verwende ich clickATell mit unserem PHP-Server Um die Nachricht zu senden, ist die API-Dokumentation ziemlich klar. Und wenn Sie die Nachricht direkt von der Anwendung aus versenden möchten, kann SMSgateway helfen.

Der letzte Schritt ist die Überprüfung des von SMSerhaltenen Codes. _ Ist der in den Geräteeinstellungen gespeicherte Code. Dies ist ziemlich einfach und unkompliziert. Sie müssen lediglich eine EditText angeben. Wenn der Benutzer den von seinem Telefon erhaltenen Code eingeben darf, muss er, falls der Code mit den in den Geräteeinstellungen gespeicherten OTP-Einstellungen übereinstimmt, die App durchlaufen lassen, andernfalls wird eine entsprechende Fehlermeldung angezeigt.


ein klassischer Zug: Nicht obligatorisch, aber vorzugsweise können Sie, da viele Anwendungen dies tun, einen SMS Listener zum Abhören der anstehenden Nachrichten bereitstellen und den Code aus den empfangenen Nachrichten abrufen Nachricht, zeigen Sie es in der Code-Überprüfung editText an, überprüfen Sie es. Wenn ja, gehen Sie durch die App.

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>

der Zuhörer:

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

der Empfänger:

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