Google OAuth 2.0离线访问权限

时间:2014-04-09 07:31:46

标签: oauth-2.0 google-oauth

即使用户不在,我的应用也需要访问用户的数据。所以我的授权代码请求包括access_type=offline,这意味着如果这是用户第一次验证我的应用,我将获得刷新令牌。我保存刷新令牌并稍后使用它。

一切都按预期工作,非常好。但困扰我的是documentation中的陈述:

  

请注意,刷新令牌的数量会有限制   发行;每个客户端/用户组合一个限制,和所有客户端的每次使用。您应该长期保存刷新令牌   存储并继续使用它们,只要它们仍然有效。如果你的   应用程序请求太多的刷新令牌,它可能会遇到这些   限制,在这种情况下,旧的刷新令牌将停止工作。

如果我理解正确的话,如果用户授权的应用程序太多,我保存的刷新令牌可能会无效吗?!它是否正确?在这种情况下,应用程序应该如何反应?请求另一个刷新令牌?

提前致谢。


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

  1. 电子邮件X,项目A,客户端ID abc
  2. 电子邮件X,项目A,客户端ID def
  3. 电子邮件X,项目B,客户端ID mno
  4. 电子邮件Y,项目C,客户端ID xyz
  5. 我通过为每个客户端请求刷新令牌来开始测试。然后我为第一个客户端ID abc请求了24个更新刷新令牌。此时所有刷新令牌均有效,即使电子邮件X我有27个刷新令牌。然后当我为标识为abc的客户端请求另一个刷新令牌时,该客户端的第一个刷新令牌失效,因此每个电子邮件/客户端组合达到25个令牌限制。所有其他令牌仍然有效,我设法为客户def生成新令牌。此客户端适用于同一个项目A和同一个电子邮件X。所以我不能达到第二个限制。这些陈述对我来说仍然是一个完全的错误:

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

      

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

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

      

    请注意,刷新令牌的数量会有限制   发行;每个客户端/用户组合一个限制,每个用户另一个限制   所有客户

1 个答案:

答案 0 :(得分: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 Apps管理员,则可以   创建其他管理员用户并使用它们来授权一些   客户端。

因此,只要您的应用程序未被同一用户安装超过15次,您就不应该遇到问题。如果这是一个问题,您可以建议他们为您的应用程序使用不同的/专用登录。