使用NodeMailer配合OAuth 2.0发邮件时如何触发Google账号登录授权提示?
实现客户自主授权Gmail发邮件的解决方案
- 第一步:调整Google Cloud应用配置
你之前用OAuth Playground的配置仅适用于个人测试,先进入Google Cloud控制台,找到你创建的OAuth 2.0客户端ID对应的项目,打开OAuth同意屏幕配置:- 把用户类型设置为外部,如果你的客户都归属你的企业组织内部也可以选内部类型
- 授权范围添加
https://mail.google.com/,和你之前测试使用的权限保持一致 - 把应用从测试状态切换为生产状态,否则测试用户的授权会7天过期,且最多仅支持添加100个测试用户
- 第二步:前端添加授权触发流程
建议在企业主的后台设置页新增「绑定Gmail发件账号」按钮,不要等到用户点击发送邮件时才触发授权。点击按钮后跳转Google官方授权地址,携带参数要求如下:client_id填你Google Cloud生成的客户端ID,redirect_uri填你后端接收授权回调的接口地址,response_type设为code,scope填https://mail.google.com/,额外添加access_type=offline参数才能拿到长期有效的refresh_token - 第三步:后端处理授权回调存储凭证
用户同意授权后,Google会将授权码回调到你填写的redirect_uri地址,你拿到授权码后调用Google OAuth的token接口,兑换出对应用户的access_token和refresh_token,将这两个凭证和当前登录的企业主账号绑定后加密存储到你的数据库,全程不需要收集用户的Google账号密码。 - 第四步:发邮件时动态调用凭证
企业主点击发送邮件时,先从数据库取出对应账号绑定的refresh_token,调用Google接口刷新出有效期1小时的有效access_token,再动态生成Nodemailer的传输配置即可发送邮件,和你之前自测发邮件的逻辑一致,仅需把固定写死的个人凭证替换为读取当前登录用户的动态凭证即可。
注意事项:
- 由于
mail.google.com属于Google的敏感权限,你需要提交应用审核,如实说明你仅用该权限帮助用户发送业务邮件,不会读取、修改用户的其他邮件内容,否则用户授权时会看到未验证应用的风险提示refresh_token属于高敏感信息,必须加密存储,避免泄露后被滥用- 如果用户在Google账号设置里撤销了对你应用的授权,你需要捕获token失效的报错,引导用户重新绑定授权即可
内容的提问来源于stack exchange,提问作者Nagusameta
相关产品推荐
相关产品推荐

