Sobes.tech
Middle+

Comment assurer un accès sécurisé au jeton d'autorisation pour une autre application?

sobes.tech IA

Réponse de l'IA

Plusieurs méthodes peuvent être envisagées.

  1. Content Provider avec accès restreint : Créez votre propre ContentProvider, dans lequel implémenter la logique pour obtenir le jeton. Restreignez l'accès à l'aide de permissions, qui seront définies dans le manifeste de votre application. Une autre application devra demander cette permission pour pouvoir accéder au Content Provider.

    <!-- Dans AndroidManifest.xml de votre application -->
    <permission android:name="com.your_app.PERMISSION_GET_TOKEN"
                android:label="@string/permission_get_token_label"
                android:description="@string/permission_get_token_description"
                android:protectionLevel="signature" />
    
    <application ...>
        <provider
            android:name=".TokenContentProvider"
            android:authorities="com.your_app.token_provider"
            android:exported="true"
            android:readPermission="com.your_app.PERMISSION_GET_TOKEN"
            ... />
    </application>
    
    // Exemple d'implémentation de ContentProvider
    public class TokenContentProvider extends ContentProvider {
        // ... implémentation de query() pour émettre le jeton avec vérification des permissions ...
    }
    

    Une autre application doit déclarer la demande de cette permission :

    <!-- Dans AndroidManifest.xml de l'autre application -->
    <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />
    

    Le niveau protectionLevel="signature" garantit que seul le même certificat signé application pourra accéder au Content Provider. C'est la méthode la plus sûre pour échanger des données entre applications de la même entreprise (même développeur).

  2. Service avec liaison et vérification UID/PackageName : Créez un service (Service) qui fournira une méthode pour obtenir le jeton. Une autre application peut se lier à ce service (bindService). À l'intérieur du service, lors du traitement de la requête, vous pouvez obtenir l'UID ou le PackageName de l'application appelante et vérifier si elle est de confiance.

    // Exemple d'implémentation de Service avec AIDL
    public class TokenService extends Service {
        private ITokenService.Stub binder = new ITokenService.Stub() {
            @Override
            public String getToken() throws RemoteException {
                // Vérification de l'appelant par getCallingUid() ou getPackagesForUid()
                String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
                // Vérification des packages par rapport à la liste autorisée
                if (isAllowedPackage(packages)) {
                    // Retourner le jeton (supposé stocké de manière sécurisée)
                    return "your_auth_token";
                } else {
                    throw new SecurityException("Accès non autorisé");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL (Android Interface Definition Language) est utilisé pour définir l'interface du service pour l'interaction inter-processus.

  3. SharedPreferences avec mode MODE_WORLD_READABLE (non recommandé) : Enregistrez le jeton dans SharedPreferences avec le drapeau MODE_WORLD_READABLE. Cela permet à toute application de lire ce fichier. Cette méthode est obsolète et non recommandée en raison de faibles niveaux de sécurité.

    // Méthode non sécurisée (obsolète)
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Transmission via Intent avec restrictions : Transmettez le jeton via Intent (par exemple, via startActivity avec des données). Cependant, c'est la méthode la moins sûre, car les données dans l'Intent peuvent être interceptées. Si vous devez transmettre le jeton de cette manière, utilisez des données chiffrées et vérifiez la signature numérique ou le PackageName de l'application réceptrice.

    // Exemple (nécessite des mesures de sécurité supplémentaires)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // Le jeton doit être chiffré
    startActivity(intent);
    

Le choix de la méthode dépend des exigences de sécurité et du niveau de confiance entre votre application et celle qui doit accéder au jeton. Les méthodes les plus sûres sont Content Provider et Service avec vérification explicite de l'appelant.