android - API 21 上的 AccountManager getAuthToken SecurityException(23+ 工作)
问题描述
我正在尝试使用AccountManager.getAuthToken()
我自己的身份验证器(但在具有不同签名的不同应用程序中)。我知道我需要权限GET_ACCOUNTS
和USE_CREDENTIALS
. 这些已添加并正在工作。
但是当我getAuthToken()
第一次通过getAuthToken()
-variant 调用时遇到了一个问题,它使用activity
-parameter 来显示一个对话框,要求用户授予对身份验证器的访问权限 ( GrantCredentialsPermissionActivity
)。
这在 API 26+ 上运行良好。显示对话框,在授予访问权限后,我得到一个令牌。
但这在 API 21 - 26 上不起作用。在这里,没有显示对话框,并且获取result
失败getAuthToken()
并OperationCanceledException
logcat 显示:
java.lang.SecurityException:要使用 KEY_INTENT 启动的活动必须共享 Authenticator 的签名
在 API 24 上,消息有更多细节:
java.lang.SecurityException:KEY_INTENT 解析为包 (android) 中的一个 Activity (android.accounts.GrantCredentialsPermissionActivity),它不与提供的身份验证器 (my.package.name) 共享签名。
但是当使用getAuthToken()
带有布尔值的 -variantnotifyAuthFailure
而不是activity
显示触发“访问请求”对话框的通知时。并且在授予之后,可以获得令牌。
所以看起来有点奇怪。提到的对话框来自系统,而不是我的身份验证器而不是调用应用程序。在用户通过此对话框授予对它的访问权限之前,甚至不会调用身份验证器。
我认为这是一个类似于Android AccountManager 的 getAuthToken SecurityException 的问题,但没有答案。
这是我正在谈论的对话框(从http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator获取):
解决方案
推荐阅读
- azure-log-analytics - 未提供有效的身份验证
- php - 如何在网页上显示表单输入
- javascript - Curl - 带有嵌套 JSON 数组的 POST 请求?
- google-bigquery - BigQuery - 创建外部表
- python - 使用 Python 和 Mysql 连接器发送空间数据
- java - 如何在布尔方法中使用 PrintWriter 作为参数
- c# - C# LINQ IdentityContext 多组加入
- c++ - 如何使用 Xlib 显示在运行时计算的图像?
- javascript - 用javascript、html设置星期几
- python - 计算圆形数组中元素之间的距离