为什么 PyDrive 一段时间后停止刷新访问令牌?

问题描述 投票:0回答:2

我正在使用 PyDrive 定期将某些内容上传到我的云端硬盘(大约每 15 分钟左右),但过了一段时间(我没有具体检查过,我相信是一两周)它会停止上传任何内容,而是生成以下内容错误信息:

pydrive2.auth.RefreshError: Access token refresh failed: invalid_grant: Token has been expired or revoked.

现在,当然,为了设置这个,我必须浏览谷歌的一大堆极其神秘的子页面,我不太了解这些子页面(我有计算机工程背景,但也许我不应该理解这个web 的东西),所以有些东西不能正常工作也就不足为奇了;我只是不知道那是什么。

在执行上传的脚本所在的项目文件夹中,我有一个保持不变的

client_secrets.json
文件,每当它停止刷新我的访问令牌时,我必须删除
credentials.json
文件,再次运行脚本并手动通过浏览器进行身份验证;完成此操作后,它会愉快地再上传 1-2 周,然后我必须再次执行此操作。

python authentication google-drive-api credentials pydrive
2个回答
2
投票

用于访问您的云端硬盘的访问令牌的有效期仅为 1 小时。之后,您需要重新授权应用程序,或者如果您的应用程序还请求了刷新令牌,您可以使用此刷新令牌来请求新的访问令牌。

刷新令牌具有无限的生命周期,因此一旦拥有刷新令牌,就可以“永远”继续使用它来获取新的访问令牌,但有多种情况可能会使它们失效。您可以在文档中找到这些内容。根据您对问题的描述,我猜测最可能的原因是这个:

为外部用户类型配置 OAuth 同意屏幕且发布状态为“测试”的 Google Cloud Platform 项目将获得刷新令牌,该令牌将在 7 天后过期。

如果没有看到您的代码,无法确定,但很可能它首先请求访问和刷新令牌,然后它继续使用刷新令牌。当令牌在 7 天后过期时,它会发现它已被撤销并抛出错误。令牌被撤销后,获取新令牌的唯一方法是再次手动验证。

解决方案是检查您的OAuth同意屏幕设置并确保状态设置为“正在生产”。

如果这不是原因,则可能是您的应用程序始终请求新的刷新令牌,但始终仅使用第一个刷新令牌。每个客户端 ID 的令牌数限制为 100 个,因此最旧的令牌在达到此限制后就会失效,或者您可能以某种方式撤销应用程序的访问权限。最有可能的是项目状态,所以首先检查一下。

参考资料:


0
投票

我对仅由我用来管理驱动器操作的桌面应用程序也有同样的问题。 我将状态从测试更改为“生产中”,但现在我遇到了这个新的身份验证问题:

错误400:invalid_request 为了确保用户安全,带外 (OOB) 流已被阻止。请遵循下面开发人员文档中链接的带外 (OOB) 流迁移指南,将您的应用迁移到替代方法。

文档位于 https://developers.google.com/identity/protocols/oauth2/resources/oob-migration 报告:

OAuth 带外 (OOB),也称为手动复制/粘贴选项,是一种遗留流程,旨在支持没有重定向 URI 的本机客户端在用户批准 OAuth 同意请求后接受凭据。 OOB 流会带来远程网络钓鱼风险,客户端必须迁移到替代方法来防范此漏洞。 所有客户端类型(即 Web 应用程序、Android、iOS、通用 Windows 平台 (UWP)、Chrome 应用程序、电视和有限输入设备、桌面应用程序)均已弃用 OOB 流程。

此弃用仅适用于生产应用程序(即发布状态设置为“生产中”的应用程序。该流程将继续适用于具有测试发布状态的应用程序。

那么如何在基于 pydrive 的生产应用程序中解决这个问题?

© www.soinside.com 2019 - 2024. All rights reserved.