使用nodemailer & Google OAuth发送邮件,工作了7天,但是得到了无效的grant
Using nodemailer & Google OAuth to send email, working for 7 days, but get invalid grant
我一直在努力为使用 nodemailer 的自动电子邮件 node.js 网络应用程序设置 Oauth 通信。 (我不想使用 gmail 的安全性较低的应用程序设置)。
我已采取措施从 oauth playground 获取客户端 ID、密码和刷新令牌,并已将网络应用程序设置为在首次加载时使用存储的刷新令牌来请求新的访问令牌。
它能够发送电子邮件(大约 7 天),然后我在客户端收到错误无效状态代码 400,在服务器端收到 and/or 无效授权.
回到 google playground 并获取另一个刷新令牌,然后在环境变量中更新它,再解决这个问题一周。但我想无限期地解决这个问题。
我阅读了 somewhere“一个 Google 云平台项目,其 OAuth 同意屏幕配置为外部用户类型,发布状态为 'Testing'刷新令牌将在 7 天后到期”...所以上周我将应用程序切换到“生产中”(在 console.cloud.google.com)并尝试使用 google 对其进行验证。本周,同样的问题再次出现,表明这不是正确的解决方法,或者尚未通过 google.
验证
我不知道这样做是否正确,我也不知道这是否是此 expiring/revoked 刷新令牌或无效授权的真正解决方案。
我也遇到过这些解释:
用户撤销了您应用的访问权限。
刷新令牌已六个月未使用。
用户更改了密码并且刷新令牌包含 Gmail 范围。
用户帐户已超过授予(实时)刷新令牌的最大数量。
如果客户端不是服务帐户,则已达到每个帐户 50 个刷新令牌的限制。
(我这周没有做任何更改,所以...不确定为什么会更改)
问题是刷新令牌吗?
还是申请状态?
会不会是 dns/cname/cloudflare 服务器问题?
导致无效授予的原因有很多,我觉得您的刷新令牌即将过期。
如果您在 google 开发者控制台上的项目仍在测试中,尚未移至已发布且尚未通过 google 应用程序验证流程,则刷新令牌的有效期最长为两周跨度之后它们将过期,这可以解释您的无效授权。问题是 google 没有官方消息表明这种情况正在发生,这正是许多开发人员最近看到的情况。
另一个与 gmail 范围有关,如果用户更改密码,这也会导致刷新令牌过期。
对于以后遇到同样问题的人:
事实证明,google 验证不是必需的。
似乎刷新令牌在一周或 7 天后过期是由于放置了 oauth2Client.setCredentials() 函数调用和 accessToken 变量。
调用 setCredentials() 并在 SendEmail() 函数内部获取访问令牌(在 运行 时间,就在发送电子邮件之前,而不是在应用程序 start/spinup 时间)似乎启用了代码以更动态地生成它需要的令牌。 12 天后,它似乎仍然有效,所以我认为这是成功的。
我猜测它之前为什么不起作用是因为在函数外部设置凭据意味着代码在 server/application 启动时仅 运行 一次。然后它将获得的访问令牌存储在 const.
访问令牌最终会过期,即使在函数内部调用again/later获取新的访问令牌,也无法更改const property/variable的值,并且所以在续费失败的一周后,呼叫不可避免地会失败。
希望这对遇到类似问题的其他人有所帮助。
我为 运行-on 句子道歉。
我一直在努力为使用 nodemailer 的自动电子邮件 node.js 网络应用程序设置 Oauth 通信。 (我不想使用 gmail 的安全性较低的应用程序设置)。
我已采取措施从 oauth playground 获取客户端 ID、密码和刷新令牌,并已将网络应用程序设置为在首次加载时使用存储的刷新令牌来请求新的访问令牌。
它能够发送电子邮件(大约 7 天),然后我在客户端收到错误无效状态代码 400,在服务器端收到 and/or 无效授权.
回到 google playground 并获取另一个刷新令牌,然后在环境变量中更新它,再解决这个问题一周。但我想无限期地解决这个问题。
我阅读了 somewhere“一个 Google 云平台项目,其 OAuth 同意屏幕配置为外部用户类型,发布状态为 'Testing'刷新令牌将在 7 天后到期”...所以上周我将应用程序切换到“生产中”(在 console.cloud.google.com)并尝试使用 google 对其进行验证。本周,同样的问题再次出现,表明这不是正确的解决方法,或者尚未通过 google.
验证我不知道这样做是否正确,我也不知道这是否是此 expiring/revoked 刷新令牌或无效授权的真正解决方案。
我也遇到过这些解释:
用户撤销了您应用的访问权限。
刷新令牌已六个月未使用。
用户更改了密码并且刷新令牌包含 Gmail 范围。
用户帐户已超过授予(实时)刷新令牌的最大数量。
如果客户端不是服务帐户,则已达到每个帐户 50 个刷新令牌的限制。
(我这周没有做任何更改,所以...不确定为什么会更改)
问题是刷新令牌吗? 还是申请状态? 会不会是 dns/cname/cloudflare 服务器问题?
导致无效授予的原因有很多,我觉得您的刷新令牌即将过期。
如果您在 google 开发者控制台上的项目仍在测试中,尚未移至已发布且尚未通过 google 应用程序验证流程,则刷新令牌的有效期最长为两周跨度之后它们将过期,这可以解释您的无效授权。问题是 google 没有官方消息表明这种情况正在发生,这正是许多开发人员最近看到的情况。
另一个与 gmail 范围有关,如果用户更改密码,这也会导致刷新令牌过期。
对于以后遇到同样问题的人: 事实证明,google 验证不是必需的。 似乎刷新令牌在一周或 7 天后过期是由于放置了 oauth2Client.setCredentials() 函数调用和 accessToken 变量。
调用 setCredentials() 并在 SendEmail() 函数内部获取访问令牌(在 运行 时间,就在发送电子邮件之前,而不是在应用程序 start/spinup 时间)似乎启用了代码以更动态地生成它需要的令牌。 12 天后,它似乎仍然有效,所以我认为这是成功的。
我猜测它之前为什么不起作用是因为在函数外部设置凭据意味着代码在 server/application 启动时仅 运行 一次。然后它将获得的访问令牌存储在 const.
访问令牌最终会过期,即使在函数内部调用again/later获取新的访问令牌,也无法更改const property/variable的值,并且所以在续费失败的一周后,呼叫不可避免地会失败。
希望这对遇到类似问题的其他人有所帮助。
我为 运行-on 句子道歉。