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.
-
Content Provider met beperkte toegang: Maak je eigen
ContentProviderwaarin 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). -
Service met binding en UID/PackageName verificatie: Maak een
Servicedie 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.
-
SharedPreferences met
MODE_WORLD_READABLE(niet aanbevolen): Sla het token op inSharedPreferencesmet de flagMODE_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); -
Overdracht via Intent met beperkingen: Geef het token door via een
Intent(bijvoorbeeld metstartActivityen 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.