Sobes.tech
Middle+

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ů.

  1. 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).

  2. 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.

  3. SharedPreferences s režimem MODE_WORLD_READABLE (nedoporučuje se): Uložit token do SharedPreferences s příznakem MODE_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);
    
  4. Přenos přes Intent s omezeními: Přenést token přes Intent (například přes startActivity s 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.