简体   繁体   English

Google OAuth2:尝试访问 Google Drive API 时,“错误:没有访问、刷新令牌或 API 密钥已设置”

[英]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:其他一些需要注意的事项:

  • I installed the google drive api library with yarn add googleapis@39 , so I am using v39 of the api.我使用yarn add googleapis@39安装了谷歌驱动器 api 库,所以我使用的是 api 的 v39。
  • I made my credentials by following the instructions in the tutorial, and downloading the file that was generated我按照教程中的说明制作了我的凭据,并下载了生成的文件
  • Ive debugged and confirmed that the auth object in listFiles is defined and the credentials exist我已调试并确认 listFiles 中的 auth object 已定义且凭据存在

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.

相关问题 谷歌 API。 无访问,刷新令牌,API 键或刷新处理程序回调设置 - Google API. No access, refresh token, API key or refresh handler callback is set 如何在 google oauth2 中使用刷新令牌获取访问令牌? - How to get access token using refresh token in google oauth2? 尝试获取访问令牌时,LinkedIn REST API OAuth2 401 authenticated_client错误 - LinkedIn REST API OAuth2 401 unauthorized_client error when trying to get access token 如何使用 api 密钥访问 Google Drive - How to use api key to access the Google Drive Google OAuth2 API刷新令牌 - Google OAuth2 API Refresh Tokens 如何使用 google oauth2 撤销 google drive 登录的访问令牌? - How to revoke access token of google drive login using google oauth2? 如何使用节点 js 客户端库使用刷新令牌谷歌 oAuth2 获取新的访问令牌 - How to get a new access token using refresh token google oAuth2 using node js client library 使用 google oauth2 节点库,无法使用刷新令牌获取新的访问令牌 - Using google oauth2 node library, can't get new access token with refresh token 使用oAuth2时缺少谷歌表api密钥 - google sheets api key missing when using oAuth2 Google OAuth2 + react-google-login:尝试检索刷新令牌时出现“redirect_uri_mismatch” - Google OAuth2 + react-google-login: "redirect_uri_mismatch" when trying to retrieve a refresh token
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM