我正在写1)在AccountManager中存储用户名和密码的应用程序,以及2)一个单独的后台服务应用程序,它访问这些凭据以登录我的服务器等.玩弄这个,我发现我能够从服务(app 2)调用AccountManager.getPassword(account)来访问我使用其他应用程序(app 1)添加到AccountManager的帐户类型.
由于这个原因,我开始想知道什么阻止任意恶意应用从1)包括清单中的字段进行帐户管理访问,然后2)迭代通过特定类型的所有帐户并调用mAccountManger.getPassword (帐户)对他们.我知道在安装过程中会弹出一个对话框请求使用的所有权限的对话框,但我认为我们不能指望普通用户拒绝某个应用,因为它会请求可疑权限.
有没有办法阻止在帐户类型上调用getPassword?有没有办法保护AccountManager中的帐户免受那些给自己很多帐户权限的应用程序的影响?
我有一个使用AccountManager存储用户帐户的应用程序.用户使用OAuth2.0 password-username凭据流登录并通过我的REST API注册.
用户收到的访问令牌将在2小时后到期,需要刷新才能再次过期,依此类推.
我需要在我的身份验证器中实现这个刷新功能.
我有一个模型AccessToken,其中包含以下字段:
String accessToken, String tokenType, Long expiresIn, String refreshToken, String scope, Long createdAt.
所以目前,我getAuthToken在AccountAuthenticator课堂上的方法中收到了这个AccessToken对象,并将其accessToken字段用作Auth Token我的客户经理.
我需要的是以某种方式使用我的客户经理存储刷新令牌和身份验证令牌,当应用程序尝试访问API并获得错误响应时:{"error": "access token expired"},使用先前收到refreshToken的AccessToken对象中的字符串刷新当前访问令牌.但是,我不确定应该怎么做.
我getAuthToken在authenticator类中的方法目前如下所示:
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account,
String authTokenType, Bundle options) throws NetworkErrorException {
if (!authTokenType.equals(AccountGeneral.AUTHTOKEN_TYPE_READ_ONLY) &&
!authTokenType.equals(AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS)) {
final Bundle result = new Bundle();
result.putString(AccountManager.KEY_ERROR_MESSAGE, "Invalid authTokenType");
return result;
}
final AccountManager manager …Run Code Online (Sandbox Code Playgroud) 我已经实现了我的AccountManager身份验证器和服务以及整个交易,这一切似乎都运行良好.
但是,有一个小问题:我只希望我的应用程序的单个帐户存在于帐户管理器中,但似乎无法找到限制此方法的方法.
在添加新帐户之前,我是唯一可以进行搜索并删除当前帐户(按类型)的解决方案吗?
我目前的代码:
private void removeAccounts()
{
Account [] accounts = mAcctMgr.getAccountsByType (mAccountType);
if (accounts.length == 0) return;
final Handler handler = new Handler ();
AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>()
{
@Override
public void run(AccountManagerFuture<Boolean> arg0)
{
// nada
}
};
for (Account a : accounts) {
mAcctMgr.removeAccount (a, callback, handler);
}
}
Run Code Online (Sandbox Code Playgroud)
我绝不会称之为优雅的解决方案,但此刻似乎是唯一有效的方法.
我正在开发一个项目,我必须使用用户的主电子邮件自动填充EditText,我将主要电子邮件视为与Google Play商店相关联的电子邮件.我已阅读这个帖子并实现了,
如果我们使用AccountManager类来设置电子邮件ID,我们将获得该电话中添加的所有电子邮件ID,因此这是不可能的,有些人说要获取AccountManager返回的第一个电子邮件ID,但是返回第一次在手机中添加的电子邮件ID.
即,假设我添加了test@gmail.com并将其与google play相关联,之后我添加了test_new@gmail.com并将此帐户与Play商店相关联,此时我正在使用此帐户的Play商店.如果我写了如下代码;
Account[] accountList = AccountManager.get(this).getAccountsByType("com.google");
Log.d("Play store account:" , accountList[0].name);
Run Code Online (Sandbox Code Playgroud)
声明的预期输出是test_new@gmail.com,但我得到test@gmail.com
有什么方法可以解决这个问题吗?
请帮我提出你的想法.
在按照本教程使用OAuth 2和Android AccountManager时,我被告知在指定AUTH_TOKEN_TYPE时,而不是像这样指定范围:
String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";
Run Code Online (Sandbox Code Playgroud)
你可以使用它的别名:
String AUTH_TOKEN_TYPE = "Manage your tasks";
Run Code Online (Sandbox Code Playgroud)
这允许用户理解权限是什么而不是给予URL.我想弄清楚Google Documents List API的别名是什么.
然后,该文档指向一个auth令牌别名列表,但遗憾的是该列表不存在.还有一个相关的Youtube视频,其中开发人员提到了Google Buzz别名,并且还提到将在某个时刻设置别名列表.
我可以使用什么代替Google文档范围?
String AUTH_TOKEN_TYPE = "oauth2:https://docs.google.com/feeds/"
Run Code Online (Sandbox Code Playgroud) 我通过扩展AbstractAccountAuthenticator和实现addAccount()和创建了自己的Android帐户身份验证器getAuthToken().其中的一些方法被称为AccountManager,但其他方法则没有.
AccountManager accountManager = AccountManager.get(activity);
accountManager.addAccount(MyAccountAuthenticator.ACCOUNT_TYPE,
MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null, null,
activity, callback, null);
Run Code Online (Sandbox Code Playgroud)
当我打电话给AccountManager#getAuthToken()我时,问题就出现了Activity.AccountManager不会调用getAuthToken()我在我的定义中的方法AccountAuthenticator.它调用一些其他默认方法,只检查authToken启动之前是否存在AuthenticatorActivity.
getAuthToken()方法:AccountManager accountManager = AccountManager.get(activity);
accountManager.getAuthToken(
mAccount, MyAccountAuthenticator.AUTHTOKEN_TYPE_FULL_ACCESS, null,
activity, callback, handler);
Run Code Online (Sandbox Code Playgroud)
我创建了我的服务并定义了onBind().addAccount()不应该工作.
public IBinder onBind(Intent intent) {
return intent.getAction().equals(ACTION_AUTHENTICATOR_INTENT) ? new MyAccountAuthenticator(this).getIBinder() : null;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我addAccountExplicitly在MyAuthenticatorActivity应用程序获取用户的身份验证令牌后调用.
课堂上的片段MyAuthenticatorActivity extends AccountAuthenticatorActivity: …
我有一个关于使用Android帐户管理器进行身份验证的问题.我们有一个后端和一个Android应用程序,用户应该使用他的Facebook帐户登录我们的后端.目前我们为此目的展示了一个webview,它可以正常运行oAuth 2,但使用Android帐户管理器对用户来说更安全,更容易,因此我们想切换.我的问题是,服务器如何验证用户是否真的是他假装的人.由于我们不能信任App,我们必须从服务器端与fb交谈以验证用户是否真的是他假装的人.根据一个非常相似的想法,我做了下面的图表,问你这是否是正确的方法,或者我错过了什么:
流程看起来像这样:
这是正确的方法吗?步骤6是一个好主意,将令牌传递给"我的服务器"还是有更好的方法?顺便说一句Facebook就是一个例子,我们使用不同的身份验证提供商,如FB,谷歌和Twitter,但每个人的流量应该是相同的.
我目前将Android应用设置为使用Android的AccountManager功能,使用SyncAdapter和经过身份验证的帐户自动执行同步.
我只有一个同步适配器运行,它同步所有内容,但我想将其分开,以不同的间隔执行不同内容的同步.
我如何拥有像Google这样的多个同步项?

我有两个使用相同自定义帐户类型的应用.这两个应用程序是完全独立的,只是共享帐户.当其中一个启动时,它会检查现有的自定义帐户,如果未找到任何帐户,则会显示登录页面.
所以我创建了我AccountAuthenticator的图书馆项目并在两个应用程序中引用它.根据本教程:
假设您将验证者的代码复制到了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);
Run Code Online (Sandbox Code Playgroud)
提前致谢
account android accountmanager android-authenticator android-account
当我在我的应用程序中使用test1@gmail.com登录时.它使用我的电子邮件成功生成帐户
现在我注销并使用不同的电子邮件登录,如test2@gmail.com,然后生成这样的帐户
我想知道哪种方式最好
1)删除第一个帐户并添加第二个帐户
2)如果可以更新,则用第二个帐户更新第一个帐户.
如果我删除并再次添加帐户使用addAccountExplicitly它需要一些时间来创建新帐户,所以我的下一个代码执行,帐户返回null.
是否可以使用帮助更新帐户,updateCredentials如果是,那么如何?
我到底做了什么?
创建包含帐户所需数据的捆绑包
检查帐户是否已存在本地插入的bundle params"global_user_id",如果它已经存在,那么我必须更新用作登录的EMAIL(参见上图).
目前我正在执行,删除旧帐户和添加新帐户,但下一行是SyncAdapter配置,需要帐户.因为添加帐户需要一些时间才能获得NULL.
有没有其他解决方案来更新电子邮件ID?
android accountmanager android-authenticator android-account
accountmanager ×10
android ×10
access-token ×1
account ×1
alias ×1
api ×1
facebook ×1
google-api ×1
google-play ×1
java ×1
oauth ×1
oauth-2.0 ×1
security ×1
sync ×1