问题:我正在尝试使用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对话框的最新授权”并相应地举起旗帜。
其他信息:
android:launchMode="singleTop"
{这样做是为了正确处理深层链接}。getToken
次调用来自使用AsyncTask
执行的executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,...)
个对象。这是我目前唯一拥有的synchronization。onActivityResult
期间,在任务的onPostExecute
或其他地方)。 {尚未测试} Google+ Sign-in for Android - Google Permissions Activity Result Codes
Android Google+ integration - repeated UserRecoverableAuthException