Sobes.tech
Middle+

Чӣ гуна дастрасии бехатар ба токени иҷозат барои барномаи дигарро таъмин кардан мумкин аст؟

sobes.tech AI

Ҷавоб аз AI

Існуе некалькі спосабаў.

  1. Content Provider з абмежаваным доступам: Стварыце ўласны ContentProvider, які будзе рэалізоўваць логіку для атрымання токена. Абмежуйце доступ да яго з дапамогай дазволаў (permissions), якія будуць вызначаны ў манифесце вашага прыкладання. Іншае прыкладанне павінна будзе запытаць гэта дазвол, каб мець магчымасць звяртацца да Content Provider.

    <!-- У 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>
    
    // Прыклад рэалізацыі ContentProvider
    public class TokenContentProvider extends ContentProvider {
        // ... рэалізацыя query() для выдачы токена з праверкай дазволу ...
    }
    

    Іншае прыкладанне павінна будзе аб'явіць запыт на гэта дазвол:

    <!-- У AndroidManifest.xml іншага прыкладання -->
    <uses-permission android:name="com.your_app.PERMISSION_GET_TOKEN" />
    

    Узровень protectionLevel="signature" гарантуе, што доступ да Content Provider атрымае толькі прыкладанне, падпісанае тым жа ключом, што і ваша прыкладанне. Гэта найбольш бяспечны варыянт пры абмене дадзенымі паміж прыкладаннямі ад адной кампаніі (аднога распрацоўшчыка).

  2. Service з падключэннем і праверкай UID/PackageName: Стварыце службу (Service), якая будзе прадастаўляць метад для атрымання токена. Іншае прыкладанне можа падключыцца да гэтай службы (bindService). Унутры службы, пры апрацоўцы запыту, можна атрымаць UID або PackageName выклікаючага прыкладання і праверыць, ці з'яўляецца яно даверным.

    // Прыклад рэалізацыі Service з AIDL
    public class TokenService extends Service {
        private ITokenService.Stub binder = new ITokenService.Stub() {
            @Override
            public String getToken() throws RemoteException {
                // Праверка выклікаючага прыкладання па getCallingUid() або getPackagesForUid()
                String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid());
                // Праверка пакетаў на адпаведнасць спісу дазволеных
                if (isAllowedPackage(packages)) {
                    // Вярнуць токен (прадпалагаецца, што токен надзейна захоўваецца)
                    return "your_auth_token";
                } else {
                    throw new SecurityException("Непраўмерны доступ");
                }
            }
        };
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return binder;
        }
    }
    

    AIDL (Android Interface Definition Language) выкарыстоўваецца для вызначэння інтэрфейсу сэрвісу для міжпрацэснай узаемадзеяння.

  3. SharedPreferences з рэжымам MODE_WORLD_READABLE (не рэкамендуецца): Захаваць токен у SharedPreferences з флагам MODE_WORLD_READABLE. Гэта дазваляе любому прыкладанню прачытаць гэты файл. Гэты метад састарэлы і не рэкамендуецца да выкарыстання з-за нізкага ўзроўню бяспекі.

    // Небяспечны метад (застарэлы)
    SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE);
    String token = preferences.getString("auth_token", null);
    
  4. Перадача праз Intent з абмежаваннямі: Перадаць токен праз Intent (напрыклад, праз startActivity з дадзенымі). Аднак, гэта найменш бяспечны спосаб, бо дадзеныя ў Intent могуць быць перахоплены. Калі неабходна перадаць токен такім чынам, варта выкарыстоўваць зашыфраваныя дадзеныя і правяраць лічбавы подпіс або PackageName атрымліваючай прыкладання.

    // Прыклад (патрабуе дадатковых мер бяспекі)
    Intent intent = new Intent("com.other_app.ACTION_RECEIVE_TOKEN");
    intent.putExtra("token", "your_auth_token"); // Токен павінен быць зашыфраваны
    startActivity(intent);
    

Выбар метаду залежыць ад патрабаванняў да бяспекі і ўзроўню даверу паміж вашым прыкладаннем і прыкладаннем, якое патрабуе доступ да токена. Найбольш бяспечнымі з'яўляюцца Content Provider і Service з яснай праверкай выклікаючай прыкладання.