web-dev-qa-db-fra.com

Enregistrement d'utilisateur/compte d'ouverture Android avec mot de passe à usage unique (OTP)

Je souhaite implémenter fonctionnalité OTP dans mon application Android. Dans cette application, après l'inscription utilisateur recevra clé de mot de passe à usage unique. Après vérification de l'OTP, l'utilisateur pourra enregistrer/ouvrir un compte avec succès en utilisant cet OTP. Qu'est-ce que je dois faire pour y parvenir?

5
sachin110011

Vérifiez google authentifiant. https://code.google.com/p/google-authenticator/ c'est un projet open source avec fonctionnalité OTP

Code source de l'application Android https://code.google.com/p/google-authenticator/source/browse/?repo=Android

Voici le code source pour le côté serveur https://github.com/chregu/GoogleAuthenticator.php

Article Wikipedia http://fr.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm

6
Sergey Pekar

J'ai implémenté une méthode très simple d'OTP.

  1. L'activité génère un nombre aléatoire de 5 chiffres et l'envoie à un numéro de téléphone mobile via la passerelle SMS.
  2. Lors de la réception de SMS, SMS corps lu par Broadcast Reciever et copiez le code de SMS corps dans OTP EditText.
  3. Si le code aléatoire généré par l'activité et le code envoyé par sms sont identiques, l'utilisateur doit pouvoir en obtenir un autre.
10
Vipin Sharma

Comme @Vipin l'a mentionné, le meilleur moyen serait de le mettre en œuvre vous-même:

First , vous devez générer un code PIN à 4 chiffres (ou celui que vous souhaitiez), par exemple:

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

Ensuite , vous devez enregistrer ce numéro quelque part, par exemple, dans vos préférences:

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

La prochaine étape , utiliserait une passerelle SMS appropriée pour envoyer cet OTP au numéro de téléphone correspondant. Pour moi, j'utilise clickATell avec notre serveur php pour envoyer le message, la documentation api est assez clair. Et si vous souhaitez envoyer le message directement à partir de l'application, peut-être SMSgateway peut vous aider.

La dernière étape , consiste à vérifier que le code reçu par SMS est celui qui est stocké dans les préférences de l'appareil. C'est assez simple et direct. Il vous suffit de fournir une EditText pour l'utilisateur lui permettant d'entrer le code reçu par son téléphone, si le code correspond à l'OTP enregistré dans les préférences de l'appareil, faites-le passer par l'application, sinon, affichez un message d'erreur approprié.


un coup classique: Pas obligatoire, mais de préférence, car de nombreuses applications peuvent fournir à SMS auditeur l'écoute des messages à venir, en récupérant le code des messages reçus. message, affichez-le dans la vérification de code editText, vérifiez-le, si vrai, passez par l'application.

dans 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>

l'auditeur:

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

le récepteur:

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