Jak zajistit bezpečný přístup k autorizačnímu tokenu pro jinou aplikaci?
sobes.tech AI
Odpověď od AI
Lze zvážit několik způsobů.
-
Content Provider s omezeným přístupem: Vytvořte vlastní
ContentProvider, ve kterém implementujete logiku pro získání tokenu. Přístup omezte pomocí oprávnění (permissions), která budou definována v manifestu vaší aplikace. Jiná aplikace musí toto oprávnění požádat, aby mohla přistupovat k Content Provider.<!-- V AndroidManifest.xml vaší aplikace --> <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>// Příklad implementace ContentProvider public class TokenContentProvider extends ContentProvider { // ... implementace query() pro vydání tokenu s kontrolou oprávnění ... }Jiná aplikace musí deklarovat toto oprávnění:
<!-- V AndroidManifest.xml jiné aplikace --> <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />Úroveň
protectionLevel="signature"zaručuje, že k Content Provideru se dostanou pouze aplikace podepsané stejným klíčem. To je nejbezpečnější varianta pro výměnu dat mezi aplikacemi jedné společnosti (stejným vývojářem). -
Service s připojením a kontrolou UID/PackageName: Vytvořte službu (
Service), která bude poskytovat metodu pro získání tokenu. Jiná aplikace se může k této službě připojit (bindService). Uvnitř služby při zpracování požadavku lze získat UID nebo PackageName volající aplikace a ověřit, zda je důvěryhodná.// Příklad implementace Service s AIDL public class TokenService extends Service { private ITokenService.Stub binder = new ITokenService.Stub() { @Override public String getToken() throws RemoteException { // Kontrola volající aplikace pomocí getCallingUid() nebo getPackagesForUid() String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid()); // Kontrola, zda balíčky odpovídají seznamu povolených if (isAllowedPackage(packages)) { // Vrátit token (předpokládá se, že token je bezpečně uložen) return "your_auth_token"; } else { throw new SecurityException("Neautorizovaný přístup"); } } }; @Nullable @Override public IBinder onBind(Intent intent) { return binder; } }AIDL (Android Interface Definition Language) se používá k definování rozhraní služby pro meziprocesovou komunikaci.
-
SharedPreferences s režimem
MODE_WORLD_READABLE(nedoporučuje se): Uložit token doSharedPreferencess příznakemMODE_WORLD_READABLE. To umožní jakékoli aplikaci přečíst tento soubor. Tato metoda je zastaralá a nedoporučuje se kvůli nízké úrovni bezpečnosti.// Nezabezpečená metoda (zastaralá) SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE); String token = preferences.getString("auth_token", null); -
Přenos přes Intent s omezeními: Přenést token přes
Intent(například přesstartActivitys daty). Toto je však nejméně bezpečný způsob, protože data v Intent mohou být zachycena. Pokud je nutné token takto přenést, použijte zašifrovaná data a ověřte digitální podpis nebo PackageName přijímající aplikace.// Příklad (vyžaduje další bezpečnostní opatření) Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN"); intent.putExtra("token", "your_auth_token"); // Token musí být zašifrován startActivity(intent);
Volba metody závisí na požadavcích na bezpečnost a úrovni důvěry mezi vaší aplikací a aplikací, které je potřeba přístup k tokenu. Nejbezpečnější jsou Content Provider a Service s jasnou kontrolou volající aplikace.