Sobes.tech
Middle+

Kuidas tagada turvaline juurdepääs autoriseerimismärgisele teisele rakendusele?

sobes.tech AI

Vastus AI-lt

On mitu mitmeid viise:

  1. Content Provider piiratud juurdepääsuga: Looge oma ContentProvider, mis teostab tokeni saamise loogika. Piirake sellele juurdepääsu kasutades lube (permissions), mis määratakse teie rakenduse manifestis. Teine rakendus peab taotlema seda luba, et pääseda Content Provider'ile.

    <!-- Teie rakenduse 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>
    
    // Näide ContentProvider'i rakendamisest
    public class TokenContentProvider extends ContentProvider {
        // ... query() rakendamine loa kontrolliga ...
    }
    

    Teine rakendus peab deklareerima selle loa:

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

    protectionLevel="signature" tase tagab, et juurdepääs Content Provider'ile on ainult sama võtmega allkirjastatud rakendustel. See on kõige turvalisem viis andmete vahetamiseks rakenduste vahel.

  2. Service ühenduse ja UID/PackageName kontrolliga: Looge Service, mis pakub meetodit tokeni saamiseks. Teine rakendus saab selle teenusega ühenduda (bindService). Teenuse sees, töötlemisel, saate saada kutsuva rakenduse UID või PackageName ja kontrollida, kas see on usaldusväärne.

    // Näide Service'i rakendamisest AIDL-iga
    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("Lubaata juurdepääs");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL (Android Interface Definition Language) kasutatakse teenuse liidese määratlemiseks protsessidevaheliseks suhtluseks.

  3. SharedPreferences MODE_WORLD_READABLE režiimis (mitte soovitatav): Salvestage token SharedPreferences-i, millel on MODE_WORLD_READABLE lipp. See võimaldab kõigil rakendustel seda faili lugeda. See meetod on vananenud ja seda ei soovitata kasutada madala turvalisuse taseme tõttu.

    // Ebaturvaline meetod (vananenud)
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Token edastamine Intent'iga piirangutega: Saadke token Intent-i kaudu (näiteks startActivity koos andmetega). Kuid see on kõige vähem turvaline viis, kuna Intent'i andmeid saab pealt kuulata. Kui on vaja seda meetodit kasutada, kasutage krüpteeritud andmeid ning kontrollige digiallkirja või PackageName.

    // Näide (vajab täiendavaid turvameetmeid)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // Token peab olema krüpteeritud
    startActivity(intent);
    

Valik sõltub turvanõuetest ja usaldustasemest teie rakenduse ja selle rakenduse vahel, millele on vaja juurdepääsu tokenile. Kõige turvalisemad on Content Provider ja Service, millel on selge kutsuja kontroll.