4

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

任何人都知道是否有办法做到这一点?

我尝试插入自定义检查并模仿 GrantPermissionActivity,但问题是 AuthToken 已缓存,因此我无法弄清楚如何在第三方应用程序上强制执行此操作,因为 getAuthToken 将简单地通过缓存令牌的自定义代码。

请注意,这与以下问题不同:在用户已经允许访问之后,您如何强制 AccountManager 显示“访问请求”屏幕?

4

2 回答 2

2

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

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

如果token类型中不包含调用包的包名,则不返回token。

对于每种身份验证令牌类型,您还验证客户端密钥是否与客户端密钥有关。如果这是客户第一次要求每个自定义帐户类型的每个帐户的密钥,您将只返回允许访问屏幕意图。

请注意,如果您想将应用列入白名单,也可以基于每个帐户令牌类型进行。

于 2013-01-16T16:41:11.063 回答
1

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

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

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

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

于 2013-01-04T07:37:29.513 回答