我们目前使用 google-api-python-client
来处理用户的 OAuth 流程。我们收到了几封用户的邮件,询问为什么他们的帐户无法成功导入,当我们查看时,发现他们的令牌没有适当的权限范围。例如,我们期望找到以下所有权限范围:
https://www.googleapis.com/auth/gmail.metadata
openid
https://www.googleapis.com/auth/userinfo.email
但我们只收到了最后两个权限。当我们查看 OAuth 流程时,我们注意到我们的 OAuth 流程如下(应用程序名称和帐户名称已隐去)。请注意,请求的权限范围有一个复选框,默认情况下未被选中。 (从2020年中期到大约一周前,此流程还有另外2个确认步骤,但最后一个复选框默认已被勾选。)
将其与受欢迎的应用程序 Fantastical 的 OAuth 流程进行比较(包括 Spark 在内的许多其他应用程序看起来都很相似):
在发现链接到Google博客上的这篇文章的StackOverflow答案后,似乎有一些应用程序被纳入了第二个流程,但第一个流程是新默认值。有两个问题:
复选框默认情况下未选中似乎是最近的更改,我找不到任何有关它的文档。 它是否是新的默认行为,还是OAuth流程中有参数/其他内容可以更改以使其默认选中? 当它未选中时,用户会认为他们不需要选中它,所以他们点击继续,然后我们的应用程序必须抛出错误并向用户解释他们需要检查该范围复选框。这似乎有点疯狂,因为现在复选框未选中,而这是我明确要求的作用域…这是整个流程的重点。
这已经是一个问题几个月了,所以我也发布这篇文章来帮助处于同样境地的其他人。以下是其他一些可能对某些人有用的要点:
- 如果我从那个Fantastical流程中获取client_id和redirect_url,并在我们应用程序的链接中使用它们,那么流程看起来就和他们的一样。所以它似乎是由客户端ID驱动的,而不是URL或我们流程中发生的某些事情。 - 我们的应用程序已经通过了Google的第三方安全评估,并且通过了,所以很可能与我们请求的范围或我们应用程序在批准过程中的状态无关。
我们的流程和Fantastical都在webview中进行,因此它们不太可能与一个是本地应用程序,另一个是webview有关。
这种情况发生在我们请求的几个不同范围内,因此它不太可能与我们请求的范围有关(例如Fantastical的范围比我们的流程中的gmail.metadata
范围更为广泛/严格)。