Sobes.tech
Middle+

Kako obezbediti siguran pristup do tokena za autorizaciju za drugu aplikaciju?

sobes.tech АИ

Одговор од АИ

Може да се разгледа неколико начина.

  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 са јасном провером позивајуће апликације.