【问题标题】:Android AccountManager's getAuthToken SecurityExceptionAndroid AccountManager 的 getAuthToken SecurityException
【发布时间】:2015-05-07 13:47:53
【问题描述】:

我(假设应用程序“C”)正在尝试通过 Android 的 AccountManager 的 getAuthToken 函数获取已安装应用程序(例如“S”)的身份验证令牌。

这个函数没有按预期工作,它没有返回任何结果(run 函数永远不会被调用)

 AccountManagerFuture<Bundle> future1 = AccountManager.get(Main2.this).getAuthToken(account,account.type,null,false, new AccountManagerCallback<Bundle>() {
                    @Override
                    public void run(AccountManagerFuture<Bundle> future) {
                        Bundle result = null;
                        try {
                            result =   future.getResult();
                            String check = "";
                        }
                        catch (OperationCanceledException e){          }
                        catch (IOException e1){}
                        catch (AuthenticatorException e2){}

                    }
                } , new Handler(Looper.getMainLooper()));

当我看到设备 ADB 日志时,我看到以下内容

 java.lang.SecurityException: Activity to be started with KEY_INTENT must share Authenticator's signatures
            at com.android.server.accounts.AccountManagerService$Session.onResult(AccountManagerService.java:2580)
            at com.android.server.accounts.AccountManagerService$6.onResult(AccountManagerService.java:1677)
            at com.android.server.accounts.AccountManagerService$6.onResult(AccountManagerService.java:1652)
            at android.accounts.IAccountAuthenticatorResponse$Stub.onTransact(IAccountAuthenticatorResponse.java:59)

上述应用程序“C”和“S”是不相关的,因此它们使用不同的证书进行签名。

我猜该功能应该在上述情况下工作(这是 AccountManager 的主要目的之一 - 跨应用程序共享帐户访问令牌)以及(向用户抛出一个关于他是否应该允许的安全对话框' C'访问'S'),它不工作的原因是什么?我在这里有什么遗漏吗?

谢谢

【问题讨论】:

  • 你提到的场景有什么解决方案吗?因为我也被困在这里。如果您已修复,请提供您的解决方案。谢谢
  • 您找到解决方案了吗?我想我遇到了类似的问题:对我来说,GrantCredentialsPermissionActivity 没有显示在 API getAuthToken()-variant 而不是带有活动的变体时。

标签: android accountmanager


【解决方案1】:
  1. 首先转到应用程序 S 中的 AbstractAuthenticator 实现。找到 getAuthToken() 实现。检查,您作为 KEY_INTENT 返回的活动。它必须与身份验证器在同一个应用程序中(是的,有一些方法可以从另一个应用程序启动活动)。
  2. 请确保您在真实设备上运行,因为在这种情况下您必须看到“授予权限”android 系统屏幕。
  3. 如果你来这里,除了一些错误,我不知道其他原因。尝试完全删除这两个应用并重新启动模拟器,然后检查问题是否仍然存在。

【讨论】:

  • 我也有同样的问题。我试过你的解决方案。但是我的 Authenticator 类中的 getAuthToken() 方法从未调用过。你知道什么原因吗?
  • 听起来像是另一个问题。 getAuthToken() 被调用一次,如果你不使其失效,android 系统将返回缓存值而不是后续调用 getAuthToken()
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2011-09-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
相关资源
最近更新 更多