Kako obezbediti siguran pristup do tokena za autorizaciju za drugu aplikaciju?
sobes.tech АИ
Одговор од АИ
Може да се разгледа неколико начина.
-
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-у могу да имају само апликације потписане истим кључем. Ово је најсигурнија опција за размену података између апликација исте компаније (истог развојног тима). -
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) се користи за дефинисање интерфејса сервиса за међупроцесну комуникацију.
-
SharedPreferences са режимом
MODE_WORLD_READABLE(не препоручује се): Сачувајте токен уSharedPreferencesса флагомMODE_WORLD_READABLE. Ово омогућава било којој апликацији да прочита овај фајл. Ова метода је застарела и не препоручује се због ниског нивоа безбедности.// Не безбедна метода (застарела) SharedPreferences preferences = getSharedPreferences("token_prefs", Context.MODE_WORLD_READABLE); String token = preferences.getString("auth_token", null); -
Пренос преко 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 са јасном провером позивајуће апликације.