错误:未设置访问、刷新令牌或 API 密钥
Posted
技术标签:
【中文标题】错误:未设置访问、刷新令牌或 API 密钥【英文标题】:Error: No access, refresh token or API key is set 【发布时间】:2018-10-21 05:05:19 【问题描述】:我正在尝试在 Node 中制作一个应用程序来访问我的谷歌日历,所以我按照https://developers.google.com/calendar/quickstart/nodejs 的步骤操作,但我收到了Error: Error: No access, refresh token or API key is set.
。
是的,我已经创建了凭据。
是的,我已经下载了 json,重命名为 client_secret.json 并添加到应用程序文件夹中。
代码如下:
const fs = require('fs');
const readline = require('readline');
const google = require('googleapis');
const OAuth2Client = google.auth.OAuth2;
const SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'];
const TOKEN_PATH = './client_secret.json';
try
const content = fs.readFileSync('client_secret.json');
authorize(JSON.parse(content), listEvents);
catch (err)
return console.log('Error loading client secret file:', err);
function authorize(credentials, callback)
const client_secret, client_id, redirect_uris = credentials.installed;
let token = ;
const oAuth2Client = new OAuth2Client(client_id, client_secret, redirect_uris[0]);
// Check if we have previously stored a token.
try
token = fs.readFileSync(TOKEN_PATH);
catch (err)
return getAccessToken(oAuth2Client, callback);
oAuth2Client.setCredentials(JSON.parse(token));
callback(oAuth2Client);
function getAccessToken(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 callback(err);
oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
try
fs.writeFileSync(TOKEN_PATH, JSON.stringify(token));
console.log('Token stored to', TOKEN_PATH);
catch (err)
console.error(err);
callback(oAuth2Client);
);
);
function listEvents(auth)
const calendar = google.calendar(version: 'v3', auth);
calendar.events.list(
calendarId: 'primary',
timeMin: (new Date()).toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime', , (err, data) =>
if (err) return console.log('The API returned an error: ' + err);
const events = data.items;
if (events.length)
console.log('Upcoming 10 events:');
events.map((event, i) =>
const start = event.start.dateTime || event.start.date;
console.log(`$start - $event.summary`);
);
else
console.log('No upcoming events found.');
);
有什么想法吗?
【问题讨论】:
“应用程序文件夹”同const TOKEN_PATH = './client_secret.json';
?
是的,我可以看到从文件中加载的内容。
感谢您的回复。我发布了确认点。请检查一下。
【参考方案1】:
您能否再次确认以下几点?
const TOKEN_PATH = './client_secret.json';
和const content = fs.readFileSync('client_secret.json');
的文件是一样的。
请将const TOKEN_PATH = './client_secret.json';
修改为const TOKEN_PATH = './credentials.json';
,然后重新运行。
这样,您下载的client_secret.json
可能已经被覆盖。所以也请确认一下。
即使进行了上述修改,仍然出现错误时,请确认googleapis的版本。因为据报道 googleapis 使用 v25.0.0 - v30.0.0。对某些 API 有一些错误。
如果您认为错误是bug,请将googleapis的版本修改为v24.0.0。错误可能会被消除。
参考资料:
How do I update my google sheet in v4? Create a gmail filter with Gmail API nodejs, Error: Filter doesn't have any criteria Insufficient Permission when trying to create a folder on Google Drive via API(v3) Youtube Data API V3 - Error fetching video with google.youtube.videos.list() Google drive API - Cannot read property 'OAuth2' of undefined How to run a Google App Script using Google API Service Library (Node.js)如果这些要点对您的情况没有帮助,我很抱歉。
【讨论】:
谢谢。 token 和 readFile 上的文件相同,将 TOKEN_PATH 更改为 ./credentials.json 改变了游戏规则。以上是关于错误:未设置访问、刷新令牌或 API 密钥的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Google api 客户端获取刷新令牌并上传文件