Android : comment résoudre l'exception Cleartext HTTP traffic to * not permitted ?

Depuis la version 8 d'Android, l'accès de l'application que l'on développe a été modifié pour davantage de sécurité. La navigation en clair, c’est-à-dire sans aucune sécurité est par défaut interdite. Si vous sollicitez une URL non protégée, vous aurez alors au moment de l'exécution de votre application ce message "Cleartext HTTP traffic to * not permitted". Il existe plusieurs solutions pour résoudre ce souci.

L'option la plus sécurisée consiste à utiliser le protocole HTTPS. Si l'URL que vous utilisez gère ce protocole, remplacez la chaîne "http://" par "https://" afin d'utiliser un protocole sécurisé pour accéder aux données. L'exception disparaîtra alors lors de l'exécution de l'application. Il s'agit de la meilleure solution pour ce problème, car elle vous apportera une sécurité renforcée.

Si vous êtes dans le cas pour lequel il n'existe pas d'URL sécurisée, il existe différentes solutions qui permettent de contourner ce problème. On peut ajouter dans une application Android le fichier XML network_security_config.xml. On peut ajouter dans ce fichier des domaines pour lesquels on souhaite autoriser la navigation en clair. Pour effectuer cette manipulation, créez le fichier dans le dossier "res/xml" et ajoutez-y le code suivant :

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">monsiteinternet.fr</domain>
    </domain-config>
</network-security-config>

L'attribut "includeSubdomains" permet d'ajouter tous les sous-domaines d'un domaine, comme ici monblog.monsiteinternet.fr. Vous devez ensuite modifier le fichier AndroidManifest.xml, à la racine de votre application, pour indiquer la présence du fichier de configuration.

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application... android:networkSecurityConfig="@xml/network_security_config" ...>
        …
    </application>
</manifest>

L'avantage de cette option est que l'on n'autorise que les requêtes à destination des domaines que l'on choisit. Cela permet de garder un niveau de sécurité important, surtout si l'on est celui qui gère le ou les domaine(s) cible(s).

Une autre option consiste à modifier directement le fichier AndroidManifest.xml. On peut, lors de la déclaration de l'application, ajouter le paramètre "android:usesCleartextTraffic" avec comme valeur "true" pour indiquer que le trafic réseau vers les sites non sécurisés est autorisé.

<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application... android:usesCleartextTraffic="true" ...>
        ...
    </application>
</manifest>

Vous devez faire attention avec cette modification, car il n'y a plus de contrôle de sécurité , quel que soit le site indiqué, le trafic sera autorisé.

Lorsque vous modifiez le fichier AndroidManifest.xml, faites également attention à la présence du paramètre "android:targetSandboxVersion". S'il est présent, sa valeur influe directement sur l'option "usesCleartextTraffic". Sa valeur doit être fixée à 1, sinon les autres modifications ne seront pas prises en compte, le trafic en clair vers des sites en HTTP étant interdit par défaut dans les autres niveaux.

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

Android