Чӣ гуна дастрасии бехатар ба токени иҷозат барои барномаи дигарро таъмин кардан мумкин аст؟
sobes.tech AI
Ҷавоб аз AI
Існуе некалькі спосабаў.
-
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 з яснай праверкай выклікаючай прыкладання.