首页 > 解决方案 > 使用 nodemailer & Google OAuth 发送邮件,工作 7 天,但获得无效授权

问题描述

我一直在努力使用 nodemailer 为自动发送电子邮件的 node.js Web 应用程序设置 Oauth 通信。(我不想使用 gmail 的不太安全的应用程序设置)。

我已采取措施从 oauth 游乐场获取客户端 ID、机密和刷新令牌,并将 Web 应用程序设置为在首次加载时使用存储的刷新令牌来请求新的访问令牌。

它能够发送电子邮件(大约 7 天),然后我在客户端收到错误无效状态代码 400,和/或在服务器端收到无效授权。

回到谷歌游乐场并获得另一个刷新令牌,然后在环境变量中更新它,再解决一周。但我想无限期地解决这个问题。

我在某处读到“为外部用户类型配置了 OAuth 同意屏幕且发布状态为“测试”的 Google Cloud Platform 项目发出了一个在 7 天后到期的刷新令牌”......所以上周我将应用程序切换到“在生产中”(在 console.cloud.google.com 上)并尝试通过谷歌对其进行验证。本周,同样的问题再次出现,表明这不是正确的解决方案,或者尚未通过谷歌验证。

我不知道这是否正确完成,也不知道这是否是此过期/撤销刷新令牌或无效授权的真正解决方案。

我也遇到过这些解释

用户已撤消您应用的访问权限。

刷新令牌已六个月未使用。

用户更改了密码,并且刷新令牌包含 Gmail 范围。

用户帐户已超过授予(实时)刷新令牌的最大数量。

如果客户端不是服务帐户,则客户端已达到每个帐户 50 个刷新令牌的限制。

(我在这一周内没有做任何改变,所以......不知道为什么这些会改变)

问题是刷新令牌吗?还是申请状态?会是 dns/cname/cloudflare 服务器问题吗?

标签: oauth-2.0firebase-authenticationgoogle-oauthnodemailerrefresh-token

解决方案


对于那些将来有同样问题的人:事实证明,谷歌验证是没有必要的。一周或 7 天后到期的刷新令牌似乎是由于放置了 oauth2Client.setCredentials() 函数调用和 accessToken 变量。

调用 setCredentials() 并在 SendEmail() 函数内部获取访问令牌(在运行时,就在发送电子邮件之前,而不是在应用程序启动/启动时)似乎使代码能够更动态地生成所需的令牌。12 天后,它似乎仍然有效,所以我称之为成功。

我对它之前为什么不起作用的猜测是因为在函数之外设置凭据意味着代码只在服务器/应用程序启动时运行一次。然后它将获得的访问令牌存储在一个常量中。

访问令牌最终会过期,即使在函数内部再次/稍后调用以获得新的访问令牌,它也无法更改 const 属性/变量的值,因此一周后调用将不可避免地失败当它未能更新时。

希望这可以帮助其他有类似问题的人。
我为连续的句子道歉。


推荐阅读