Android自定义身份验证器允许访问屏幕

时间:2013-01-03 21:30:04

标签: android accountmanager

当通过Google的身份验证器登录时,每个应用程序的每个帐户(uid)会提示一次“允许访问”屏幕(GrantPermissionActivity),但是没有记录在哪里可以选择为自定义第三方身份验证器显示该屏幕。

任何人都知道有没有这样做?

我尝试插入自定义检查并模仿GrantPermissionActivity,但问题是AuthToken是缓存的,所以我无法弄清楚如何在第三方应用上强制执行此操作,因为getAuthToken只需传递自定义代码令牌缓存。

请注意,这与以下问题不同:How do you force AccountManager to show the "Access Request" screen after a user has already allowed access?

2 个答案:

答案 0 :(得分:2)

我想我已经找到了一个非常好的解决方案,但这可能不是谷歌允许屏幕的工作方式。

在Authenticator中,您将获得调用包,因为AccountManager会验证应用程序的UID / PID,因此无法进行欺骗。您使用调用包作为令牌类型的一部分以及应用程序的安装日期(可选,通过使用包管理器找到),这样每个应用程序的令牌将单独缓存。

如果令牌类型不包含包名称作为调用包,则不会返回任何令牌。

对于每个身份验证令牌类型,您还验证客户端密钥是否与客户端密钥相关。然后,如果这是客户端第一次根据每个自定义帐户类型请求每个帐户的密钥,则只会返回“允许访问”屏幕意图。

请注意,如果您想要白名单应用,您也可以基于每个帐户令牌类型执行此操作。

答案 1 :(得分:1)

我没有完整的答案,但也许我可以帮助你。

在查看getAuthToken实现时,您可以看到如果身份验证器使用customTokens,则会自动授予权限。如果使用自定义令牌,AuthenticationDescription的文档还会提到“身份验证器处理其自己的令牌缓存和权限屏幕”。因此,如果您遇到这种情况,我认为不可能出现此屏幕。

  

我尝试插入自定义检查并模仿GrantPermissionActivity,但问题是AuthToken是缓存的......

如果使用invalidateAuthToken使令牌无效,则应从缓存中清除该令牌。只需记住将要使其无效的令牌传递给该方法(请参阅AccountManager: invalidateAuthToken does not invalidate the token)。