Sobes.tech
Middle+

Hoe zorg je voor veilige toegang tot de autorisatietoken voor een andere applicatie?

sobes.tech AI

Antwoord van AI

Er kunnen verschillende methoden worden overwogen.

  1. Content Provider met beperkte toegang: Maak je eigen ContentProvider waarin je de logica implementeert voor het verkrijgen van een token. Beperk de toegang hiermee via permissies, die in de manifest van je app worden gedefinieerd. Een andere app moet deze permissie aanvragen om toegang te krijgen tot de Content Provider.

    <!-- In de AndroidManifest.xml van je app -->
    <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>
    
    // Voorbeeld van implementatie van ContentProvider
    public class TokenContentProvider extends ContentProvider {
        // ... implementatie van query() voor het uitgeven van een token met permissiecontrole ...
    }
    

    Een andere app moet deze permissie aanvragen:

    <!-- In de AndroidManifest.xml van de andere app -->
    <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />
    

    De protectionLevel="signature" garandeert dat alleen apps ondertekend met dezelfde sleutel toegang krijgen tot de Content Provider. Dit is de veiligste optie voor gegevensuitwisseling tussen apps van hetzelfde bedrijf (zelfde ontwikkelaar).

  2. Service met binding en UID/PackageName verificatie: Maak een Service die een methode biedt om een token te verkrijgen. Een andere app kan zich aan deze service koppelen (bindService). Binnen de service kan bij het verwerken van het verzoek de UID of PackageName van de aanroepende app worden gecontroleerd op betrouwbaarheid.

    // Voorbeeld van een Service met AIDL
    public class TokenService extends Service {
        private ITokenService.Stub binder = new ITokenService.Stub() {
            @Override
            public String getToken() throws RemoteException {
                // Controleer de aanroepende app via getCallingUid() of getPackagesForUid()
                String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
                // Controleer of de pakketten in de lijst van toegestane pakketten staan
                if (isAllowedPackage(packages)) {
                    // Geef het token terug (ervan uitgaande dat het token veilig is opgeslagen)
                    return "your_auth_token";
                } else {
                    throw new SecurityException("Unauthorized access");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL (Android Interface Definition Language) wordt gebruikt om de interface van de service te definiëren voor interprocescommunicatie.

  3. SharedPreferences met MODE_WORLD_READABLE (niet aanbevolen): Sla het token op in SharedPreferences met de flag MODE_WORLD_READABLE. Dit maakt dat elke app dit bestand kan lezen. Deze methode is verouderd en wordt niet aanbevolen vanwege lage beveiliging.

    // Onveilig (verouderd)
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Overdracht via Intent met beperkingen: Geef het token door via een Intent (bijvoorbeeld met startActivity en data). Dit is echter de minst veilige methode, omdat gegevens in de Intent kunnen worden onderschept. Als je het token op deze manier moet overdragen, gebruik dan versleutelde gegevens en controleer digitale handtekeningen of de PackageName van de ontvankelijke app.

    // Voorbeeld (vereist extra beveiligingsmaatregelen)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // Het token moet versleuteld zijn
    startActivity(intent);
    

De keuze van methode hangt af van de beveiligingsvereisten en het vertrouwen tussen jouw app en de app die toegang tot het token nodig heeft. De veiligste methoden zijn Content Provider en Service met expliciete controle van de aanroepende app.