【发布时间】:2020-06-22 18:23:50
【问题描述】:
我正在尝试通过 gmail API 从 Node.js 应用程序发送电子邮件。我按照文档并使用 node-mailer 包进行了这项工作。但是,我注意到当我们更改组织密码时,连接不再良好(这是有道理的)。因此,我尝试使用 JWT 进行授权。
JWT 已正确生成并发布到 https://oauth2.googleapis.com/token。然后这个请求会返回一个 access_token。
在编写和发送电子邮件时,我尝试简单地调整以前工作的代码(当时使用 client_secret、client_id 和 redirect_uris):
const gmail = google.gmail({ version: 'v1', auth: access_token });
gmail.users.messages.send(
{
userId: 'email',
resource: {
raw: encodedMessage
}
},
(err, result) => {
if (err) {
return console.log('NODEMAILER - The API returned: ' + err);
}
console.log(
'NODEMAILER Sending email reply from server: ' + result.data
);
}
);
API 不断返回Error: Login Required。
有人知道怎么解决吗?
编辑
我已修改我的代码和身份验证以添加 client_id 和 client_secret:
const oAuth2Client = new google.auth.OAuth2(
credentials.gmail.client_id,
credentials.gmail.client_secret,
credentials.gmail.redirect_uris[0]
);
oAuth2Client.credentials = {
access_token: access_token
};
const gmail = google.gmail({ version: 'v1', auth: oAuth2Client });
gmail.users.messages.send(
{
userId: 'email',
resource: {
raw: encodedMessage
}
},
(err, result) => {
if (err) {
return console.log('NODEMAILER - The API returned: ' + err);
}
console.log(
'NODEMAILER Sending email reply from server: ' + result.data
);
}
);
但现在错误更不精确了:Error: Bad Request
【问题讨论】:
-
您能否分享更多有关您的实际请求的信息?这是在获取访问令牌之前还是之后失败?你使用什么范围?我可以建议看看README.md of the official Node.js library
-
嗨@Raserhin,这仅在电子邮件尝试发送时失败(gmail.users.messages.send)。 access_token 已正确生成,唯一使用的范围是 www.googleapis/auth/gmail.send。我相信这可能与需要使用服务帐户有关?我需要这种集成始终自动运行,无需用户授权。
-
您如何验证您的服务帐户?据我所知,如果服务帐户不使用域范围的委派(想象一下所有可能产生的垃圾邮件),他们就无法使用 Gmail。您是否使用域范围的委派?如果您不熟悉该主题,可以阅读some information here 或here。您是否真的试图冒充您域中的用户?
-
我确实找到了问题所在。出于某种原因,将 userId 设置为要模拟的电子邮件不起作用,但是将其设置为“我”就像一个魅力
-
我很困惑,您使用的是您帐户的凭据还是服务帐户的凭据?另外请记住将您的解决方案作为答案发布,以便其他人可以从中受益。
标签: google-api jwt google-oauth gmail-api