Sobes.tech
Middle+

Kā nodrošināt drošu piekļuvi autorizācijas tokenam citai lietojumprogrammai?

sobes.tech AI

Atbilde no AI

Ir ir ir:

  1. Content Provider ar ierobežota piekļuve: Izveidojiet savu ContentProvider, kas realizēs loģiku tokena saņemšanai. Ierobežojiet piekļuvi ar atļaujām (permissions), kas tiks definētas jūsu lietotnes manifestā. Cita lietotne būs jālūdz šī atļauja, lai varētu piekļūt Content Provider.

    <!-- Jūsu lietotnes AndroidManifest.xml -->
    <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>
    
    // Piemērs, kā realizēt ContentProvider
    public class TokenContentProvider extends ContentProvider {
        // ... query() realizācija ar atļaujas pārbaudi ...
    }
    

    Cita lietotne būs jādeklarē šī atļauja:

    <!-- Citas lietotnes AndroidManifest.xml -->
    <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />
    

    protectionLevel="signature" līmenis garantē, ka piekļuve Content Provider ir tikai tam pašam parakstītajai lietotnei. Tas ir drošākais veids, kā apmainīties ar datiem starp lietotnēm.

  2. Service ar pievienošanos un UID/PackageName pārbaudi: Izveidojiet Service, kas nodrošinās metodi tokena saņemšanai. Cita lietotne var pievienoties šai servisai (bindService). Servisa iekšienē, apstrādājot pieprasījumu, var iegūt izsaucējošās lietotnes UID vai PackageName un pārbaudīt tās uzticamību.

    // Piemērs, kā realizēt Service ar AIDL
    public class TokenService extends Service {
        private ITokenService.Stub binder = new ITokenService.Stub() {
            @Override
            public String getToken() throws RemoteException {
                String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
                if (isAllowedPackage(packages)) {
                    return "your_auth_token";
                } else {
                    throw new SecurityException("Neatļauts piekļuve");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL (Android Interface Definition Language) tiek izmantots, lai definētu servisa saskarni starp procesiem.

  3. SharedPreferences ar režīmu MODE_WORLD_READABLE (nav ieteicams): Saglabājiet tokenu SharedPreferences ar MODE_WORLD_READABLE flagu. Tas ļauj jebkurai lietotnei lasīt šo failu. Šis paņēmiens ir novecojis un nav ieteicams drošības līmeņa dēļ.

    // Nedrošs paņēmiens (novecojis)
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Pārsūtīšana ar Intent ar ierobežojumiem: Pārsūtiet tokenu ar Intent (piemēram, ar startActivity). Tomēr tas ir vismazāk drošais veids, jo dati Intent var tikt noķerti. Ja nepieciešams pārsūtīt tokenu šādā veidā, izmantojiet šifrētus datus un pārbaudiet digitālo parakstu vai PackageName.

    // Piemērs (prasa papildu drošības pasākumus)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // Tokenu jāšifrē
    startActivity(intent);
    

Izvēle ir atkarīga no drošības prasībām un uzticības līmeņa starp jūsu lietotni un lietotni, kurai nepieciešams piekļūt tokenam. Visdrošākie ir Content Provider un Service ar skaidru izsaucējošās lietotnes pārbaudi.