node.js - 使用 OAUTH 2.0 的谷歌云
问题描述
所以..我正在尝试使用 gmail api 来解决测试问题,并且我在讨论如何执行 OAUTH 2.0 事情,这是现在的响应:
请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。请参阅https://developers.google.com/identity/sign-in/web/devconsole-project。
我访问了谷歌云控制台并创建了一个,但是当我尝试使用它时它不起作用,似乎我在创建它时做错了。
任何人都可以帮助调试吗?
这是代码片段
const email_id = await fetch(
"https://content-gmail.googleapis.com/gmail/v1/users/the_destaionation%email.com/messages?includeSpamTrash=true&q=from%3some%email.com%20&maxResults=1&key=___key___",
{
headers: {
"x-origin": "https://explorer.apis.google.com",
authorization:
"Bearer this is the key i want to generate and i don't know how",
},
}
)
.then((res) => res.json())
.then((data) => {
return data.messages[0].id;
});
解决方案
使用您创建的凭据创建访问令牌是一个多步骤过程。服务器端的网络应用程序 我建议不要编写所有手册,而是遵循 google的 gmail api 快速入门。
const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = 'token.json';
// Load client secrets from a local file.
fs.readFile('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), listLabels);
});
/**
* Create an OAuth2 client with the given credentials, and then execute the
* given callback function.
* @param {Object} credentials The authorization client credentials.
* @param {function} callback The callback to call with the authorized client.
*/
function authorize(credentials, callback) {
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, (err, token) => {
if (err) return getNewToken(oAuth2Client, callback);
oAuth2Client.setCredentials(JSON.parse(token));
callback(oAuth2Client);
});
}
/**
* 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.
* @param {getEventsCallback} callback The callback for the authorized client.
*/
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);
});
});
}
/**
* Lists the labels in the user's account.
*
* @param {google.auth.OAuth2} auth An authorized OAuth2 client.
*/
function listLabels(auth) {
const gmail = google.gmail({version: 'v1', auth});
gmail.users.labels.list({
userId: 'me',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
const labels = res.data.labels;
if (labels.length) {
console.log('Labels:');
labels.forEach((label) => {
console.log(`- ${label.name}`);
});
} else {
console.log('No labels found.');
}
});
}
推荐阅读
- r - 查找每个向量元素所在的范围
- flask - flask开发单终端:不退出flask继续编辑代码
- mysql - 无法将文件加载到 mysql 表:错误代码:2 - 没有这样的文件或目录
- php - 在我的 mysql 表中,在一个单元格中有行,我有数组。如何选择具有特定数组值的行?
- gams-math - gams 指定具有大量零的通量网络(稀疏矩阵)
- java - 在字符串数组中查找字符串值的搜索方法
- javascript - Slack bot 私人频道发布消息
- docker - 为什么在运行 docker 容器后网站会打印 403 禁止的 nginx 错误?
- rest - REST API:将“批量”附加到 api 以在同一资源上创建批量创建?
- rpm - 如何删除从 rpm 安装后安装但升级时不需要的文件?