Google OAuth 2.0 离线访问

3
我的应用需要在用户不在场时访问用户的数据。因此,我的授权码请求包括access_type=offline,这意味着如果用户第一次验证我的应用程序,我将得到一个刷新令牌。我保存刷新令牌并在以后使用它。
一切都按预期和良好运作。但是,文档中有一条声明让我感到困扰:
请注意,有关客户端/用户组合的发行限制;每个客户端/用户组合有一个限制,而所有客户端的每个使用也有一个限制。您应该将刷新令牌保存在长期存储中,并在其有效期内继续使用它们。如果您的应用程序请求过多的刷新令牌,则可能会遇到这些限制,此时旧的刷新令牌将停止工作。
如果我理解正确,如果用户授权了太多应用程序,我保存的刷新令牌可能会变为无效?这是正确的吗?在这种情况下,应用程序应该如何反应?请求另一个刷新令牌吗?
提前致谢。

编辑:我创建了一个测试PHP脚本,用于从4个Google客户端(通过客户端,我指的是在Dev控制台中生成的凭据)请求刷新令牌。其中三个链接到一个gmail地址,第四个链接到另一个gmail地址。对于第一个电子邮件,我生成了2个项目,并且对于第一个项目,我生成了2个客户端ID。因此:

  1. 电子邮件X,项目A,客户端IDabc
  2. 电子邮件X,项目A,客户端IDdef
  3. 电子邮件X,项目B,客户端IDmno
  4. 电子邮件Y,项目C,客户端IDxyz

我从为每个客户端请求一个刷新令牌开始测试。然后,我为第一个客户端ID abc 请求了24个额外的刷新令牌。此时,即使对于电子邮件X,我有27个刷新令牌,但所有刷新令牌仍然有效。然后,当我为客户端ID abc 请求另一个刷新令牌时,第一个刷新令牌失效了,因此达到了每个电子邮件/客户端组合的25个令牌限制。所有其他令牌仍然有效,我设法为客户端def 生成新令牌。这个客户端是同一个项目A和同一个电子邮件X。因此,我无法达到第二个限制。这些陈述的含义仍然完全神秘。

https://developers.google.com/accounts/docs/OAuth2#expiration

如果您需要授权多个程序、机器或设备,一个解决办法是限制每个用户帐户授权的客户端数量为15或20。如果您是Google应用程序管理员,您可以创建其他管理员用户并使用它们来授权一些客户端。

https://developers.google.com/accounts/docs/OAuth2WebServer#refresh

请注意,关于刷新令牌的发放存在一些限制:每个客户端/用户组合有一个限制,以及在所有客户端中每个用户还有另一个限制。

我从谷歌开发人员那里得到了回复:“我不确定每个用户在所有客户端上的限制是多少,但我之前没有听说过有人达到过这个限制。如果我得到了消息,我会告诉你。”因此,我们仍在等待官方信息以了解这意味着什么。 - Linda Lawton - DaImTo
@DaImTo 谢谢。我自己也不能碰到任何其他限制。但是确切地了解总是更好的。再次感谢。 - Martin Dimitrov
1个回答

3
实际上,情况并没有你想象的那么糟糕。刷新令牌是应用程序特定的,这意味着它是针对您的客户端ID特定的。如果用户安装了您的应用程序多次,则他们将有多个与您的应用程序相关联的刷新令牌。
如果用户在超过20个SSIS包中运行我的连接管理器,则我在SSIS连接管理器中遇到了这个问题,第一个安装的连接管理器将停止工作。 https://developers.google.com/accounts/docs/OAuth2#expiration
Token expiration

You should write your code to anticipate the possibility that a granted token might
no longer work. 
A token might stop working for one of these reasons:
  • 用户已撤销访问权限。
  • 令牌未使用时间超过六个月。
  • 用户账户的令牌请求已超出一定数量。

每个 Google 用户账户目前限制为 25 个令牌。如果用户账户拥有 25 个有效令牌,下一个验证请求会成功,但会静默地使最旧的未完成令牌无效,而不会提供任何用户可见的警告。

如果您需要授权多个程序、机器或设备,请尝试将每个用户账户授权给 15 或 20 个客户端,这是一种解决方法。如果您是 Google 应用程序管理员,可以创建其他管理员用户并使用他们来授权某些客户端。

只要同一用户没有安装您的应用程序超过 15 次,就不应该有问题。如果存在问题,您可以建议他们为您的应用程序使用不同/专用的登录。


谢谢。但是他们说的是访问令牌还是刷新令牌?另外,我不太明白这个 25 个令牌的限制。比如说,用户 martin@gmail.com 授权我的应用程序,然后再授权其他 25 个应用程序。我的应用程序(最早的那个)得到的刷新令牌会被作废吗? - Martin Dimitrov
他们谈论的是刷新令牌。请记住,访问令牌只有1小时的有效期。您可以使用刷新令牌获取新的访问令牌。使用刷新令牌,您可以随时获取新的访问令牌。(顺便说一句,您是正确的,授权令牌有点令人困惑,我会给Google发送一条消息) - Linda Lawton - DaImTo
如果用户martin@gmail.com授权“YOUR APP” 15-20次,他与您的应用程序关联的第一个刷新令牌将不再起作用。这是您的应用程序,而不是其他人的应用程序。 - Linda Lawton - DaImTo
这是第一个限制条件:“每个客户端/用户组合只有一个限制”。但看看第二个条件说了什么:“在所有客户端中每次使用只有另一个限制”?!?我该如何理解这个? - Martin Dimitrov
这里是我正在测试的一个猜测,你可以为你的应用程序创建多个客户端ID。我认为他们指的是你可能已经创建的其他客户端ID。因此,如果你为你的Web应用程序和移动应用程序分别拥有一个客户端ID,它们仍然被视为同一客户端,并且都计入相同的最大15-20个。正在创建小型应用程序进行测试。 - Linda Lawton - DaImTo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接