如何解决如何将访问代码从 gmail api 传递给 Heroku 中的节点工作者
应用程序
我用 discord.js 编写了一个 discord bot 作为一个简单的 node.js 应用程序,而不是一个网络服务器。我已将 gmail api 与凭据文件集成在一起,以验证自己访问电子邮件的身份。这在本地主机上的开发中非常有效。问题
当我启动应用程序时,谷歌提示我转到外部 URL 并授权应用程序。在那里我得到一个代码,在我的应用程序的控制台中,我被提示输入该代码。当我在我的机器上运行它时很好,但是在 heroku 上运行时,我似乎无法将代码传递回应用程序。我的(失败的)解决方案
到目前为止我已经尝试过:- 使用 heroku cli 将代码传回
- 使用 heroku 界面中的集成控制台 (dynamo) 将代码传回
- 在我非常绝望的时候盲目地将它复制到日志中
在所有尝试中,令牌都没有保存在我部署的应用程序中,因此提示一次又一次。
代码
有问题的将代码传回的代码是这样的:function getNewToken(oAuth2Client,callback) {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: "offline",scope: SCOPES,});
console.log("Authorize this app by visiting this url:",authUrl);
const rl = readline.createInterface({
input: process.stdin,output: process.stdout,});
rl.question("Enter the code from that page here: ",code => {
rl.close();
oAuth2Client.getToken(code,(err,token) => {
if (err) {
return console.error("Error retrieving access token",err);
}
oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
Fs.writeFile(TOKEN_PATH,JSON.stringify(token),err => {
if (err) return console.error(err);
console.log("Token stored to",TOKEN_PATH);
});
callback(oAuth2Client);
});
});
}
我该怎么做才能解决这个问题?也许只是通过 console
记录令牌并手动保存?或者还有其他更简单的方法来验证我没有看到的吗?
解决方法
解决方案
我的解决方案是将 readline 函数交换为来自 discord bot 的操作并手动触发身份验证:const { manualAuthorization,sendToken } = require("../authorize-google");
module.exports = {
name: "authorize-google",admin: true,execute: async (_message,[code]) => {
try {
if (!code) {
await manualAuthorization();
} else {
await sendToken(code);
}
} catch (error) {
throw new Error(error.message);
}
},};
第一个命令触发身份验证,第二个命令将代码发送给机器人:
function manualAuthorization() {
OWNER = client.users.cache.get("someID");
// Load client secrets from a local file.
Fs.readFile("google-credentials.json",(err,content) => {
if (err) {
return console.log("Error loading client secret file:",err);
}
// Authorize a client with credentials,then call the Gmail API.
authorize(JSON.parse(content));
});
}
/**
* Create an OAuth2 client with the given credentials,and then execute the
* given callback function.
* @param {Object} credentials The authorization client credentials.
*/
function authorize(credentials) {
const { client_secret,client_id,redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(
client_id,client_secret,redirect_uris[0]
);
// Check if we have previously stored a token.
Fs.readFile(TOKEN_PATH,token) => {
if (err) {
return getNewToken(oAuth2Client);
}
oAuth2Client.setCredentials(JSON.parse(token));
OWNER.send("Successfully authorized");
});
}
/**
* Get and store new token after prompting for user authorization,and then
* execute the given callback with the authorized OAuth2 client.
* @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
*/
function getNewToken(oAuth2Client) {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: "offline",scope: SCOPES,});
client.oAuth2Client = oAuth2Client;
OWNER.send(`Authorize this app by visiting this url: ${authUrl}`);
}
function sendToken(code) {
client.oAuth2Client.getToken(code,token) => {
if (err) {
return console.error("Error retrieving access token",err);
}
client.oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
Fs.writeFile(TOKEN_PATH,JSON.stringify(token),err => {
if (err) {
return console.error(err);
}
console.log("Token stored to",TOKEN_PATH);
});
OWNER.send("Successfully authorized");
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。