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?
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
J'ai implémenté une méthode très simple d'OTP.
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();
}
}
};