Пользовательская учетная запись Android: исключение SecurityException: отказ в разрешении: начальное намерение

#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 /…