无法从具有相同身份验证器的不同应用添加新的自定义帐户

Posted

技术标签:

【中文标题】无法从具有相同身份验证器的不同应用添加新的自定义帐户【英文标题】:Cannot add new custom account from different app with same authenticator 【发布时间】:2015-11-27 21:03:10 【问题描述】:

我有两个应用程序都使用相同的自定义帐户类型。这两个应用程序是完全独立的,只是共享帐户。当其中一个启动时,它会检查现有的自定义帐户,如果未找到任何帐户,则会显示登录页面。

所以我创建了我的AccountAuthenticator 作为库项目并在两个应用程序中引用它。据此tutorial:

假设您将身份验证器的代码复制到了 2 个应用中,因此 共享其逻辑,并更改每个应用程序上的登录页面设计 以适应它所属的应用程序。在这种情况下,第一个安装的应用程序的 当 auth-token 将被调用时,将为两个应用程序调用验证器 请求。如果您卸载第一个应用程序,第二个应用程序的 从现在开始将调用验证器(因为它是唯一的 现在)。

当我运行其中一个应用程序(无论是哪个应用程序)并调用 addAccount 时,它会很好地显示登录页面。 然后,当我运行第二个应用程序并调用 addAccount 时,什么也没有发生,并且没有显示登录页面。卸载第一个应用程序后,第二个应用程序可以正常工作并显示登录页面。那么问题出在哪里,我该如何解决呢?

addAccount的实现:

mAccountManager.addAccount(accountType, authTokenType, null, null, this, new AccountManagerCallback<Bundle>() 
            @Override
            public void run(AccountManagerFuture<Bundle> future) 
                try 
                    Bundle bnd = future.getResult();
                    showMessage("Account was created");
                 catch (Exception e) 
                    e.printStackTrace();
                    showMessage(e.getMessage());
                
            
        , null);

提前致谢

【问题讨论】:

【参考方案1】:

找到写得好的文章Write your own android Authenticator

【讨论】:

【参考方案2】:

@Misagh Emamverdi 是的。您在清单中缺少该权限。

android:sharedUserId

将与其他应用程序共享的 Linux 用户 ID 的名称。默认情况下,Android 会为每个应用程序分配其自己的唯一用户 ID。但是,如果两个或多个应用程序的此属性设置为相同的值,则它们都将共享相同的 ID——前提是它们也由相同的证书签名。

具有相同用户 ID 的应用程序可以访问彼此的数据,并且如果需要,可以在同一进程中运行。

所以 android:sharedUserId 用于在两个或多个应用程序之间共享进程(如 Udinic Authenticator)。

语法

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="string"
      android:sharedUserId="string"
      android:sharedUserLabel="string resource" 
      android:versionCode="integer"
      android:versionName="string"
      android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
. . .

【讨论】:

【参考方案3】:

我不确定这是正确的答案,但我发现问题在于应用程序具有不同的 UID。所以我在两个应用程序中都使用了sharedUserId,问题就解决了:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:sharedUserId="test.account"
    android:versionCode="100"
    android:versionName="1.0" >

【讨论】:

以上是关于无法从具有相同身份验证器的不同应用添加新的自定义帐户的主要内容,如果未能解决你的问题,请参考以下文章

具有两个模型会话的 Cakephp 身份验证组件

WSO2 APIM 的自定义身份验证

现有表单登录应用程序中具有 OAuth2 的自定义主体

具有 Spring Security 和 Java Config 的自定义身份验证提供程序

如何为具有不同图形和媒体资产的不同发送方应用程序实现相同的自定义接收方应用程序?

从 silverlight 和针对使用 IIS 6 的自定义存储的摘要式身份验证