#android #authentication #accountmanager
#Android #аутентификация #accountmanager
Вопрос:
Я разрабатываю в Android некоторые приложения, которые будут совместно использовать токены аутентификации и аутентификации, полученные с сервера аутентификации. Я хотел бы использовать пользовательскую учетную запись Android, как предлагается здесь: https://developer.android.com/training/id-auth/custom_auth чтобы пользователь был добавлен в Настройки -> Учетные записи, а затем все авторизованные приложения могли получить доступ к токенам авторизации.
Теперь у меня есть приложение, реализующее фактическую аутентификацию. По сути:
- экземпляр AbstractAccountAuthenticator
- служба для публикации связанного IBinder
- Действие для выполнения входа в систему и сохранения учетной записи
- authenticator.xml и prefs.xml файлы и другое приложение просто как клиент, который получает доступ к аутентификации. Оба приложения имеют одинаковый пользовательский интерфейс для выполнения следующих действий (с использованием android.accounts.AccountManager):
- перечислите учетные записи моего типа
- добавьте новую учетную запись, выполняющую аутентификацию, и сохраните ее
- получить токен аутентификации
В приложении с аутентификацией я могу выполнять все действия без проблем.
В клиентском приложении я могу выполнить только первые два действия:
- проверьте, есть ли учетные записи моего типа
- доступ к токену аутентификации, сохраненному в приложении аутентификации
Если клиентское приложение попытается добавить новую учетную запись, вызывающую <a rel=»noreferrer noopener nofollow» href=»https://developer.android.com/reference/android/accounts/AccountManager#addAccount(java.lang.String, java.lang.String, java.lang.String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback, android.os.Handler)» rel=»nofollow noreferrer»>android.accounts.AccountManager#addAccount() запрос правильно доставлен экземпляру AbstractAccountAuthenticator в приложении аутентификации (передача запроса через службу), но операция входа в систему не открыта для следующей ошибки:
2021-01-14 09:15:33.902 10413-10452/xxx.client1 W/Binder: Caught a RuntimeException from the binder stub implementation.
java.lang.SecurityException: Permission Denial: starting Intent { cmp=xxx.customaccount/xxx.ui.login.LoginActivity clip={text/plain {...}} (has extras) } from ProcessRecord{db30657 10413:xxx.client1/u0a155} (pid=10413, uid=10155) not exported from uid 10154
at android.os.Parcel.createExceptionOrNull(Parcel.java:2373)
at android.os.Parcel.createException(Parcel.java:2357)
at android.os.Parcel.readException(Parcel.java:2340)
at android.os.Parcel.readException(Parcel.java:2282)
at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:3696)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1723)
at android.app.Activity.startActivityForResult(Activity.java:5320)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
at android.app.Activity.startActivityForResult(Activity.java:5278)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:662)
at android.app.Activity.startActivity(Activity.java:5664)
at android.app.Activity.startActivity(Activity.java:5617)
at android.accounts.AccountManager$AmsTask$Response.onResult(AccountManager.java:2330)
at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:97)
at android.os.Binder.execTransactInternal(Binder.java:1159)
at android.os.Binder.execTransact(Binder.java:1123)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.wm.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1032)
at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:999)
at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:669)
at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1100)
at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1072)
Добавление android: export= true для операции входа в систему аутентификация запускается, но хранилище работает некорректно (я не думаю, что это правильное направление, потому что аутентификация должна быть запущена в приложении аутентификации, чтобы правильно управлять результатом действия).
Есть предложения о том, как решить эту проблему?
Спасибо
gcast
Обновление: подозревается, что совместное использование токенов должно быть реализовано в приложениях (например, в клиентском приложении и в приложении authenticaiton) с использованием других компонентов Android в качестве связанных служб.
Комментарии:
1. Как вы начинаете вход в систему с клиента? Использование намерения с
ComponentName
?2. Не обращайте внимания на мой предыдущий комментарий. Вы получаете эту ошибку на Android 11? Если это так, это может быть связано с некоторыми новыми ограничениями видимости пакета. См. developer.android.com/about/versions/11/privacy /…