Sobes.tech
Middle+

როგორ უზრუნველვყოთ უსაფრთხო წვდომა სხვა აპლიკაციისთვის ავტორიზაციის ტოკენზე?

sobes.tech AI

პასუხი AI-სგან

Күп төрле ысуллар бар:

  1. Чикләнгән керү белән Контент Провайдеры: Үзегезнең 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>
    
    // Контент Провайдерның тормышка ашыру мисалы
    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 алынып, ышанычлы икәнен тикшерә аласыз.

    // AIDL белән Service тормышка ашыру мисалы
    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("Рөхсәтсез керү");
                }
            }
        };
    
        @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, аларда ачык рәвештә чакырган кушымтаны тикшерү.