Android中的Google+ OAuth2流程:使用临时身份验证代码确保离线访问

时间:2014-10-13 12:42:52

标签: android android-asynctask google-oauth client-side android-permissions

[ - 摘要 - ]

问题:我正在尝试使用Google+ Sign-in为Android应用实施server-side API access。我遇到的问题是临时访问代码未授予有时 offline访问权限,导致后端出现invalid_grant错误。

问题:如何在客户端确保转发到服务器的访问代码包含offline访问权限?

[精化]

在Android中的Google+ OAuth流程中,GoogleAuthUtil.getToken(...)会返回一个临时身份验证代码,该代码稍后会将访问令牌交换为请求的authorization scopes

Google's own code example中提到(在撰写本文时):

  

请求授权代码将始终抛出   第一次调用时出现UserRecoverableAuthException   GoogleAuthUtil.getToken因为用户必须同意离线   访问他们的数据。在获得同意后,将返回控制权   您在onActivityResult中的活动以及第二次调用   GoogleAuthUtil.getToken将成功。

在开发过程中,我遇到了“离线访问”对话框弹出(并且无法返回代码)的情况,它没有弹出(并返回一个损坏的代码),它弹出的地方,即使用户同意代码仍然是错误的......也是成功的尝试。即使在引入看似无关的修改时,应用程序行为似乎在这些场景之间交替。 {Edit1:在进一步阅读时,我认为流程中看似随意的行为源于存储在AccountManager中的旧代码,正如所讨论的那样here}

我在调试(而不是运行)异步代码时遇到了特殊的{读:差分同步?} app-flow的熟悉行为(因为调试允许)在UI线程上运行的任务在the asynchronous thread (see section on "Order of execution"))中的任务之前\之后结束。

到目前为止,我(隐含地)只处理了用户与应用程序“连接”的情况(即过去授权应用程序而不撤消其访问权限,可以在Manage apps page中找到)但是,对于新用户来说,这个问题会更加严重(因为他们首先会看到两个不同的权限对话框)。

我真的很困惑这整个过程应该如何正确编码{这就是为什么我不打扰包括我自己的代码},以及它是否真的这个复杂的或者它只是我。对我来说,最重要的是要理解为什么会发生这种情况,以及如何在避免blindly copying code的同时强制执行一个架构良好且统一的执行流程(这让我陷入了混乱:P)。< / p>

目前我最好的猜测是以某种方式获得“oauth对话框的最新授权”并相应地举起旗帜。

其他信息:

关于为什么会发生这种情况的理论:

  1. AsyncTask并发 - 对auth代码有效性的各种检查尝试访问可能由在不同线程上运行的任务(UI与异步同步)更改的静态变量。{if it 案例 - 它反直觉地不会导致例外}
  2. 逻辑错误 - 假设第二次尝试(或其他任何数字)上出现有效代码是检查代码有效性的错误逻辑。
  3. 尝试\想法来解决这个问题:

    1. 有一个标志,用于跟踪是第一次还是第二次收到验证码。 {尝试不起作用,可能是由于并发 - 见上文。}
    2. 获取“当前授予的权限”(来自操作系统,Google工具,AccountManager等),并检查其中是否存在脱机访问权。
    3. 获取UserRecoverableAuthException中包含的意图授予的最新权限(在主持人活动的onActivityResult期间,在任务的onPostExecute或其他地方)。 {尚未测试}
    4. 相关问题(随机顺序):

      Google+ Sign-in for Android - Google Permissions Activity Result Codes

      Android Google+ integration - repeated UserRecoverableAuthException

      Google Plus Single Sign On Server Flow - Google_AuthException Error fetching OAuth2 access token, message: 'invalid_grant'

0 个答案:

没有答案