[英]Google OAuth2: "Error: No access, refresh token or API key is set" when trying to access Google Drive API
I'm trying to simply listing files in my google drive.我试图简单地列出我的谷歌驱动器中的文件。 I am following the nodeJS tutorial for this: https://developers.google.com/drive/api/v3/quickstart/nodejs
我正在关注nodeJS教程: https://developers.google.com/drive/api/v3/quickstart/nodejs
I'm trying to understand where I went wrong.我试图了解我哪里出错了。 The code I have is exactly the same as in the tutorial.
我拥有的代码与教程中的代码完全相同。
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/drive.metadata.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 Google Drive API.
authorize(JSON.parse(content), listFiles);
});
/**
* 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 getAccessToken(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 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 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 names and IDs of up to 10 files.
* @param {google.auth.OAuth2} auth An authorized OAuth2 client.
*/
function listFiles(auth) {
const drive = google.drive({version: 'v3', auth});
drive.files.list({
pageSize: 10,
fields: 'nextPageToken, files(id, name)',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
const files = res.data.files;
if (files.length) {
console.log('Files:');
files.map((file) => {
console.log(`${file.name} (${file.id})`);
});
} else {
console.log('No files found.');
}
});
}
Some other things to note:其他一些需要注意的事项:
yarn add googleapis@39
, so I am using v39 of the api.yarn add googleapis@39
安装了谷歌驱动器 api 库,所以我使用的是 api 的 v39。Any ideas would be great.任何想法都会很棒。 I am also running node 16.13.1 and yarn 1.22.10 if that helps at all
如果有帮助的话,我也在运行 node 16.13.1 和 yarn 1.22.10
A simple fix was to change一个简单的解决方法是改变
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);
});
to至
oAuth2Client.getToken(code, (err, token) => {
if (err) return console.error('Error retrieving access token', err);
token = token.tokens;
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);
});
The tokens themselves are stored in tokens
.令牌本身存储在
tokens
中。 google oauth2 looks for the access token in the root of the credentials object, not in the tokens object where it is stored, so it's necessary to just store the tokens. google oauth2 在凭据 object 的根目录中查找访问令牌,而不是在存储它的令牌 object 中查找访问令牌,因此只需存储令牌即可。
I have no idea why this wasn't included in the tutorial.我不知道为什么这没有包含在教程中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.