1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

Authentification par empreinte digitale WM Android (code Java natif)

Discussion dans 'Windev Mobile' créé par clavis, Oct 2, 2018.

  1. clavis

    clavis New Member

    Inscrit:
    Mar 5, 2018
    Messages:
    5
    J'aime reçus:
    4
    Bonsoir à tous,
    Jusqu'à la version 22 de WM, la fonction VérifieIdentitéUtilisateur() ne marche pas.
    Je voudrais utiliser le lecteur d'empreintes malgré tout

    L'idée est d'implémenter un code JAVA d'authentification par empreintes digitales que j'ai trouvé sur internet.
    C'est un code quoi fonctionne parfaitement sur Android Studio et sur mon téléphone.

    Je n'ai pas de bonnes notions sur le langage JAVA et j'aurais besoin de vos conseils pour intégrer ce code Java à windev mobile 22.

    Le code JAVA comporte 2 classes.

    J'ai créé 2 procédures Java sur windev mobile 22 mais ça bloque à la compilation sachant que j'ai ajouté manuellement la permission USE_FINGERPRINT au Manifest.

    La classe Java principale :

    Code (Text):
    public class FingerprintActivity extends AppCompatActivity {
        private KeyStore keyStore;
        // Variable used for storing the key in the Android Keystore container
        private static final String KEY_NAME = "setiafanou";
        private Cipher cipher;
        private TextView textView;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_fingerprint);
            // Initialisatiob d' Android Keyguard Manager et Fingerprint Manager
            KeyguardManager keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
            FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);
            textView = (TextView) findViewById(R.id.errorText);
            // Verifier si le device a un lecteur d'empreinte
            if(!fingerprintManager.isHardwareDetected()){
               
                textView.setText("Votre téléphone ne possede pas de lecteur d'empreinte");
            }else {
                // Verifir les permissions dans le manifest
                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
                    textView.setText("Les permisions ne sont pas accordées");
                }else{
                    // Check whether at least one fingerprint is registered
                    if (!fingerprintManager.hasEnrolledFingerprints()) {
                        textView.setText("Aucune empreinte enregistrée");
                    }else{
                        // Checks whether lock screen security is enabled or not
                        if (!keyguardManager.isKeyguardSecure()) {
                            textView.setText("Lock screen security not enabled in Settings");
                        }else{
                            generateKey();
                            if (cipherInit()) {
                                FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
                                FingerprintHandler helper = new FingerprintHandler(this);
                                helper.startAuth(fingerprintManager, cryptoObject);
                            }
                        }
                    }
                }
            }
        }
        @TargetApi(Build.VERSION_CODES.M)
        protected void generateKey() {
            try {
                keyStore = KeyStore.getInstance("AndroidKeyStore");
            } catch (Exception e) {
                e.printStackTrace();
            }
            KeyGenerator keyGenerator;
            try {
                keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
            } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
                throw new RuntimeException("Failed to get KeyGenerator instance", e);
            }
            try {
                keyStore.load(null);
                keyGenerator.init(new
                        KeyGenParameterSpec.Builder(KEY_NAME,
                        KeyProperties.PURPOSE_ENCRYPT |
                                KeyProperties.PURPOSE_DECRYPT)
                        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                        .setUserAuthenticationRequired(true)
                        .setEncryptionPaddings(
                                KeyProperties.ENCRYPTION_PADDING_PKCS7)
                        .build());
                keyGenerator.generateKey();
            } catch (NoSuchAlgorithmException |
                    InvalidAlgorithmParameterException
                    | CertificateException | IOException e) {
                throw new RuntimeException(e);
            }
        }
        @TargetApi(Build.VERSION_CODES.M)
        public boolean cipherInit() {
            try {
                cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
            } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
                throw new RuntimeException("Failed to get Cipher", e);
            }
            try {
                keyStore.load(null);
                SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME,
                        null);
                cipher.init(Cipher.ENCRYPT_MODE, key);
                return true;
            } catch (KeyPermanentlyInvalidatedException e) {
                return false;
            } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
                throw new RuntimeException("Failed to init Cipher", e);
            }
        }
    }
    La deuxième classe :

    Code (Text):
    public class FingerprintHandler extends FingerprintManager.AuthenticationCallback {

    private Context context;


    // Constructor
    public FingerprintHandler(Context mContext) {
            context = mContext;
            }


    public void startAuth(FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject) {
            CancellationSignal cancellationSignal = new CancellationSignal();
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
            return;
            }
            manager.authenticate(cryptoObject, cancellationSignal, 0, this, null);
            }


    @Override
    public void onAuthenticationError(int errMsgId, CharSequence errString) {
            this.update("Erreur pendant l'authentication error\n" + errString, false);
            }


    @Override
    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
            this.update("Aide\n" + helpString, false);
            }


    @Override
    public void onAuthenticationFailed() {
            this.update("Authentication échouée.", false);
            }


    @Override
    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
            this.update("Authentication réussie.", true);
            }
     
    Merci beaucoup pour votre aide.
     
    Tags:
  2. Razorte

    Razorte Member

    Inscrit:
    Mai 11, 2018
    Messages:
    49
    J'aime reçus:
    50
    Tu n'a pas le code erreur lors du build, s'il te plaît ? Normalement c'est une erreur Java.
     
    joker apprécie ceci.
  3. clavis

    clavis New Member

    Inscrit:
    Mar 5, 2018
    Messages:
    5
    J'aime reçus:
    4
    Bonsoir,

    En fait, je ne sais pas comment déclarer mes 2 procédures JAVA


    1 - pour la première classe JAVA dois-je faire :
    public class FingerprintActivity extends AppCompatActivity {
    }

    ou bien :
    public static void FingerprintActivity() extends AppCompatActivity {
    }


    2 - pour la deuxième classe JAVA dois-je faire :
    public class FingerprintHandler extends FingerprintManager.AuthenticationCallback {
    }

    ou bien :
    public static void FingerprintHandler() extends FingerprintManager.AuthenticationCallback {
    }
     
    #3 clavis, Oct 3, 2018
    Dernière édition: Oct 3, 2018
  4. Man

    Man Active Member

    Inscrit:
    Juil 9, 2018
    Messages:
    290
    J'aime reçus:
    67

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    , C'est qui : -"mm" ???
    Comment se fait il que tu ne me l'ai pas encore présenté ?

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    :biggrin:
    Cliquez pour agrandir...
    Désolé

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!


    Bonjour à vous,

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    tu avais réussi à résoudre ton problème? car j'ai aussi le même soucis
    Je suis en attente de ta réponse ou tout autre intervention
    merci
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,882
    J'aime reçus:
    1,532
    Bonjour a tous,
    Essayer cela déjà pour vérifier si le capteur est présent:
    SI PASEnModeTest()ALORS
    sMonboolenest une chaîne
    sMonboolen=CapteurempreinteDetect()
    Info(sMonboolen)
    SINON
    Info("Cette fonctionnalité n'est disponible que sur l'appareil")
    FIN

    import java.util.List;
    import android.app.Activity;
    import android.content.Context;
    import android.widget.Toast;
    import android.content.SharedPreferences;

    import android.app.KeyguardManager;

    import android.content.pm.PackageManager;

    import android.hardware.fingerprint.FingerprintManager;

    import android.Manifest;
    import android.os.Build;
    import android.os.Bundle;
    import android.security.keystore.KeyGenParameterSpec;
    import android.security.keystore.KeyPermanentlyInvalidatedException;
    import android.security.keystore.KeyProperties;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v4.app.ActivityCompat;
    import android.widget.TextView;
    import java.io.IOException;
    import java.security.InvalidAlgorithmParameterException;
    import java.security.InvalidKeyException;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.UnrecoverableKeyException;
    import java.security.cert.CertificateException;
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;

    public static String CapteurempreinteDetect()
    {
    FingerprintManager fingerprintManager;
    KeyguardManager keyguardManager;

    //Récupération du context de l'application
    Context ctx= getApplicationContext();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    keyguardManager =
    (KeyguardManager) ctx.getSystemService(ctx.KEYGUARD_SERVICE);
    fingerprintManager =
    (FingerprintManager) ctx.getSystemService(ctx.FINGERPRINT_SERVICE);
    if (!fingerprintManager.isHardwareDetected()) {
    return "Your device doesn't support fingerprint authentication";
    }
    if (ActivityCompat.checkSelfPermission(ctx, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
    return "Please enable the fingerprint permission";
    }
    if (!fingerprintManager.hasEnrolledFingerprints()) {
    return "No fingerprint configured. Please register at least one fingerprint in your device's Settings";
    }
    if (!keyguardManager.isKeyguardSecure()) {
    return "Please enable lockscreen security in your device's Settings";
    } else {
    return "Vraie" ;
    }
    }
    return "Faux";
    }

    Certains import peuvent ne pas être nécessaire.
     
    Man apprécie ceci.
  • Partager cette page

    Chargement...