Google OAuth 2.0 离线访问

2024-02-02

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

一切都按预期进行并且运行得很好。但令我困扰的是其中的一个声明文档 https://developers.google.com/accounts/docs/OAuth2WebServer#refresh:

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

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

提前致谢。


EDIT:我创建了一个测试 PHP 脚本,该脚本将请求来自 4 个 Google 客户端的刷新令牌(我所说的客户端是指在开发控制台中生成的凭据)。其中三个链接到一个 Gmail 地址,第四个链接到另一个不同的地址。对于第一封电子邮件,我生成了 2 个项目,对于第一个项目,我生成了 2 个客户端 ID。所以:

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

我通过为每个客户端请求刷新令牌来开始测试。然后我为第一个客户端 ID 请求了 24 个以上的刷新令牌abc。在此刻all即使对于电子邮件,刷新令牌也是有效的X我有 27 个刷新令牌。然后当我为具有 id 的客户端请求另一个刷新令牌时abc,该客户端的第一个令牌已失效,因此达到了每个电子邮件/客户端组合 25 个令牌的限制。所有其他令牌仍然有效,我设法为客户端生成新令牌def。该客户是同一项目A和相同的电子邮件X。所以我无法达到第二个极限。这些陈述的含义对我来说仍然完全是个谜:

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

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

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

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


实际上并没有你想象的那么糟糕。刷新令牌是特定于应用程序的,这意味着特定于您的客户端 ID。如果用户多次安装您的应用程序,那么他们将拥有许多与您的应用程序相关的刷新令牌。

我在使用 SSIS 连接管理器时遇到了这个问题,如果用户让我的连接管理器在超过 20 个 SSIS 包上运行,则安装的第一个包将停止工作。

https://developers.google.com/accounts/docs/OAuth2#expiration 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 次,就不会有问题。如果这是一个问题,您可以建议他们为您的应用程序使用不同/专用的登录名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google OAuth 2.0 离线访问 的相关文章

随机推荐

  • Google 电子表格:如何在活动工作表中插入数据透视表?

    我试图在同一张工作表中添加一个数据透视表 其中有图表和其他分析 但是当我尝试添加数据透视表时 它会创建一个新工作表 我正在尝试将 Excel 仪表板转换为 Google 电子表格仪表板 只需选择要复制的数据透视表的单元格 然后将其复制并粘贴
  • RLMException',原因:'尝试在写事务之外修改对象

    当我编译以下代码时遇到以下错误 由于未捕获的异常 RLMException 而终止应用程序 原因 尝试在写入事务之外修改对象 调用 首先在 RLMRealm 实例上开始WriteTransaction for outlet in brand
  • 服务器故障后 Spring Batch 恢复

    我正在使用 Spring Batch 来解析文件 并且有以下场景 我正在做一份工作 这项工作必须解析给定的文件 由于意外原因 比如断电 服务器出现故障 我必须重新启动机器 现在 重新启动服务器后 我想从断电前停止的位置恢复作业 这意味着如果
  • 如何使用 jackson 将 Java 类转换为 Map 并将非字符串成员转换为 json?

    我有一些 Java 类 我想将其转换为Map
  • 返回保守的 impl 特征时,生命周期意味着什么?

    当搜索有关的文档时保守的隐含特质 我找到了这个例子 https github com rust lang rust issues 43719 struct A x u32 u32 10 impl A fn iter values lt a
  • 白屏死机 - PHP/Vagrant 环境中没有显示错误 (Yii)

    我不能确定这个问题是否部分是由于 vagrant 造成的 但是我在运行 Unix 的 Vagrant 盒子中安装了 Yii 1 x 我试图强制执行一个简单的 PHP 错误 例如控制器中缺少分号 即使我 100 确定我创建了一个错误 但我没有
  • 删除Python列表中包含数字的所有项目[重复]

    这个问题在这里已经有答案了 从大量字符串列表中删除包含数字的所有项目的最佳方法是什么 Input 这个 那个 那些4423 42 13b 是 2 Output 这个 那个 是 gt gt gt foo This That Those4423
  • 下一个回文数

    我是编程初学者 所以你能告诉我我的代码有什么问题吗 如果用户输入的数字 n 不是回文 我想打印下一个回文数 n int input Enter any number reverse 0 temp n while n 0 reverse re
  • 已尝试附加或添加不是新的实体,可能是从另一个 DataContext 加载的

    我遇到了 NotSupportedException 问题 我得到 已尝试附加或添加不是新的实体 可能是从另一个 DataContext 加载的 partial class SupplyOfert Model public SupplyOf
  • 为什么这个 Observable.Generate 重载会导致内存泄漏? [使用时间跨度 < 15ms]

    以下 Rx NET 代码在我的机器上运行大约 10 秒后将使用大约 500 MB 的内存 var stream Observable Range 0 10000 SelectMany i gt Observable Generate 0 j
  • Zend Framework 2 可以/应该如何包含到 Git 版本化项目中?

    应如何管理 Zend Framework 2 项目的版本控制 是否有最佳实践 标准方法 子模块 是正确的关键字吗 Zend Framework 2 项目通常是一个轻量级框架应用程序 具有各种已安装的模块 这些模块通常位于单独的专用存储库中
  • OAuth 刷新令牌最佳实践 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为一个项目实现 OAuth 我想知道处理刷新令牌的最佳方法 我调用的API将返回一个带有access token expires in和r
  • 将拖放事件转发到父视图

    我有一个应用程序 其中有一个派生自 NSView 的自定义视图 在这个视图中 有几个自定义子视图 它们也是从 NSView 派生的 我想实现拖放行为 允许将 URL 拖放到视图上 主视图的一切都已正常工作 所以 实际上我必须在子视图和父视图
  • Java Eclipse 在保存时关闭自动构建工作区

    突然 我的 Eclipse 开始在我保存时自动构建工作区 并且仅一次保存就需要很长时间 我倾向于经常保存 以前从未这样做过 所以我想知道 如何将其关闭 If you want to turn off auto Building your p
  • Gitlab CI 变量返回空字符串?

    自从我的一个项目在 Gitlab CI 上构建开始失败以来已经过去 2 天了 主要错误是E MISSING APP KEY当我通过回显检查另一个变量时 HOST and PORT从我的 gitlab ci yml配置 像这样 tests s
  • 在显示模块化模式对象上创建继承

    我正在尝试在对象之间创建某种继承 var foo function function doFooStuff console log arguments callee name return doFooStuff doFooStuff var
  • MapView 谷歌地图 NullPointerException?

    我正在尝试创建一个如何获得使用地图视图 我创建了一个 Fragment 和一个 XML 来使用它 问题是当我尝试打开 MapView 时抛出空指针异常但我不明白为什么 我该如何解决呢 XML
  • 未收到额外意向

    我正在显示来自附加到我的项目的库的通知 当单击该通知时 该通知会转到一个活动 ReceivingActivity 单击通知后活动将打开 但不会收到附加的附加内容 通知触发代码 我调用sendNotification当我收到 gcm 消息并且
  • 如何将 javax.activation.DataSource 添加到 App Engine 开发服务器?

    tl dr 我如何添加javax activation DataSource依赖于通过 App Engine Maven 插件运行的服务器 我正在使用App Engine Maven 插件 https cloud google com ap
  • Google OAuth 2.0 离线访问

    即使用户不在场 我的应用程序也需要访问用户的数据 所以我的授权码请求包括access type offline这意味着如果这是用户第一次验证我的应用程序 我将取回刷新令牌 我保存刷新令牌并稍后使用它 一切都按预期进行并且运行得很好 但令我困