带有 gmail api 的节点 js,API 返回错误:错误:未经授权的客户端 [英] node js with gmail api, The API returned an error: Error: unauthorized_client
问题描述
这段代码发生了错误:
var gmail = google.gmail('v1');
gmail.users.labels.list({
auth: auth,
userId: 'me',
}, function(err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
我正在使用带有 Node js 的 gmail api.当我浏览他们的快速入门指南时,我不断收到此错误.
I am using gmail api with Node js. When I go through their quickstart guide I keep getting this error.
https://developers.google.com/gmail/api/quickstart/nodejs
The API returned an error: Error: unauthorized_client
请记住,我使用电子邮件地址完成了快速入门,一切都很好.完全没有错误.我决定创建一个虚拟电子邮件用于测试目的.我所做的唯一更改是 step 1-g
切换 client_secret.json
文件以保存新凭据和密钥.我尝试切换回旧文件,但错误仍然存在.
Keep in mind, I went through the quickstart with my email adress, everything was fine. No errors at all. I decided to create a dummy email for test purposes. The only change I made was step 1-g
switching out the client_secret.json
files to hold the new credentials and key. I tried switching back to my old file but, the error still persists.
在页面底部的链接中提供了说明.
At the bottom of the page in the link provided it states.
Authorization information is stored on the file system, so subsequent executions will not prompt for authorization. Would I have to clear or refresh the information? If so how can I do this?
如果有帮助,我会将所有代码重新发布到我的 quickstart.js 文件中.
If it helps I will repost all the code in my quickstart.js file.
var fs = require('fs');
var readline = require('readline');
var google = require('googleapis');
var googleAuth = require('google-auth-library');
var SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
process.env.USERPROFILE) + '/.credentials/';
var TOKEN_PATH = TOKEN_DIR + 'gmail-nodejs-quickstart.json';
// Load client secrets from a local file.
fs.readFile('client_secret.json', function processClientSecrets(err, content) {
if (err) {
console.log('Error loading client secret file: ' + err);
return;
}
// Authorize a client with the loaded 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) {
var clientSecret = credentials.installed.client_secret;
var clientId = credentials.installed.client_id;
var redirectUrl = credentials.installed.redirect_uris[0];
var auth = new googleAuth();
var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
// Check if we have previously stored a token.
fs.readFile(TOKEN_PATH, function(err, token) {
if (err) {
getNewToken(oauth2Client, callback);
} else {
oauth2Client.credentials = 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 to call with the authorized
* client.
*/
function getNewToken(oauth2Client, callback) {
var authUrl = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES
});
console.log('Authorize this app by visiting this url: ', authUrl);
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('Enter the code from that page here: ', function(code) {
rl.close();
oauth2Client.getToken(code, function(err, token) {
if (err) {
console.log('Error while trying to retrieve access token', err);
return;
}
oauth2Client.credentials = token;
storeToken(token);
callback(oauth2Client);
});
});
}
/**
* Store token to disk be used in later program executions.
*
* @param {Object} token The token to store to disk.
*/
function storeToken(token) {
try {
fs.mkdirSync(TOKEN_DIR);
} catch (err) {
if (err.code != 'EEXIST') {
throw err;
}
}
fs.writeFile(TOKEN_PATH, JSON.stringify(token));
console.log('Token stored to ' + TOKEN_PATH);
}
/**
* Lists the labels in the user's account.
*
* @param {google.auth.OAuth2} auth An authorized OAuth2 client.
*/
function listLabels(auth) {
var gmail = google.gmail('v1');
gmail.users.labels.list({
auth: auth,
userId: 'me',
}, function(err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
var labels = response.labels;
if (labels.length == 0) {
console.log('No labels found.');
} else {
console.log('Labels:');
for (var i = 0; i < labels.length; i++) {
var label = labels[i];
console.log('- %s', label.name);
}
}
});
}
推荐答案
我在 TOKEN_PATH
上做了一个 console.log,它给了我文件所在的路径.
I did a console.log on TOKEN_PATH
, it gave me the path of where the file was.
我不得不删除文件
/Users/user/.credentials/gmail-nodejs-quickstart.json
这是我在 Mac 上找不到的隐藏文件夹.
which was a hidden folder I could not find on my mac.
这篇关于带有 gmail api 的节点 js,API 返回错误:错误:未经授权的客户端的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!