当前位置: 首页 > 面试题库 >

尝试通过API(v3)在Google云端硬盘上创建文件夹时权限不足

林正平
2023-03-14
问题内容

我正在尝试通过API在Google云端硬盘上创建一个文件夹。我正在使用Node,并且创建了一个脚本,该脚本可获取每日报告,并希望通过API创建一个文件夹,并将这些文件每天上传到该文件夹​​。

要进行设置,我已经按照文档的快速入门指南创建了一个项目。我的设置看上去与该样板基本相同,只是其读取了Drive中文件的功能。但是,当尝试使用docs中给出的示例进行上传时,出现错误:Insufficient Permission

浏览项目界面中的权限,有很多角色可供选择。目前,我已将我的项目分配为文件夹管理员(以及其他几个角色),这 应该
给我权限,但仍然遇到此错误。也许我需要重新生成client_secret.json文件以反映我更新的权限,但是我该怎么做?我已经在谷歌上搜索并在界面上闲逛了一段时间,但是看不到重新生成此文件的方法

我用来创建文件夹的代码看起来像这样,非常接近文档中给出的样板-只是为了看到它可以工作:

const drive = google.drive('v3')    
function createFolder (auth) {
      console.log('auth:', auth)
      const fileMetadata = {
        'name': 'daily-report',
        'mimeType': 'application/vnd.google-apps.folder',
        'parents': ['1P924MEzU_1VoL6OOvWPHSo6vb1u9u0a9'],
      }

      drive.files.create({
        auth: auth,
        resource: fileMetadata,
        fields: 'id'
      }, function (err, file) {
        if (err) {
          // Handle error
          console.error(err.message);
        } else {
          console.log('Folder Id: ', file.id);
        }
      });
    }

任何帮助表示赞赏。

更新错误:

    Token stored to /Users/sg/.credentials/
auth: OAuth2Client {
  transporter: DefaultTransporter {},
  _certificateCache: null,
  _certificateExpiry: null,
  _clientId: 'clientID093420402349.apps.googleusercontent.com',
  _clientSecret: 'totalsecret',
  _redirectUri: 'urn:ietf:wg:oauth:2.0:oob',
  _opts: {},
  credentials: 
   { access_token: 'xxxxxxxxxxxx',
     refresh_token: 'xxxxxxxxxxxx',
     token_type: 'Bearer',
     expiry_date: 1520651774212 } }
(node:76284) [DEP0013] DeprecationWarning: Calling an asynchronous function without callback is deprecated.
fs.js:106
        throw backtrace;
        ^

Error: EISDIR: illegal operation on a directory, open '/Users/sg/.credentials/'
    at rethrow (fs.js:101:21)
    at maybeCallback (fs.js:119:42)
    at Object.fs.writeFile (fs.js:1260:14)
    at storeToken (/Users/sg/R2-DS/src/middleware/aptlist-report-auth.js:104:6)
    at /Users/sg/R2-DS/src/middleware/aptlist-report-auth.js:85:7
    at /Users/sg/R2-DS/node_modules/google-auth-library/lib/auth/oauth2client.js:95:13
    at Request._callback (/Users/sg/R2-DS/node_modules/google-auth-library/lib/transporters.js:113:17)
    at Request.self.callback (/Users/sg/R2-DS/node_modules/request/request.js:186:22)
    at emitTwo (events.js:126:13)
    at Request.emit (events.js:214:7)

问题答案:

我认为您的脚本有效。那么您可以再次确认以下几点吗?

  1. 关于范围。
    • 在快速入门中,默认范围为var SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'];。但是为了使用drive.files.createhttps://www.googleapis.com/auth/drive必须将其添加到范围。
    • 如果您修改了范围,请删除的文件drive-nodejs-quickstart.json。并运行脚本。这样,将运行授权,并将添加的作用域反映到刷新令牌和访问令牌。
  2. 关于googleapis的版本
    • 最近,据报道v27.0.0,v26.0.1和v25.0.0的googleapi存在一些错误。因此,请确认您的版本,以防万一。我使用v24.0.0。
  3. 是否在API控制台上启用了Drive API。
    • 关于这一点,我认为从您的问题来看,您可能已经启用了它。

如果这些对您没有用,对不起。

编辑:

var fs = require('fs');
var readline = require('readline');
var google = require('googleapis');
var googleAuth = require('google-auth-library');

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/drive-nodejs-quickstart.json
var SCOPES = ['https://www.googleapis.com/auth/drive'];
var TOKEN_DIR = './';
var TOKEN_PATH = 'drive-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
  // Drive API.
  authorize(JSON.parse(content), createFolder);
});

/**
 * 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) {
  fs.writeFile(TOKEN_PATH, JSON.stringify(token));
  console.log('Token stored to ' + TOKEN_PATH);
}

/**
 * Lists the names and IDs of up to 10 files.
 *
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function createFolder(auth) {
      const drive = google.drive('v3');
      console.log('auth:', auth);
      const fileMetadata = {
        'name': 'daily-report',
        'mimeType': 'application/vnd.google-apps.folder',
        'parents': ['1P924MEzU_1VoL6OOvWPHSo6vb1u9u0a9'],
      };

      drive.files.create({
        auth: auth,
        resource: fileMetadata,
        fields: 'id',
      }, function(err, file) {
        if (err) {
          // Handle error
          console.error(err.message);
        } else {
          console.log('Folder Id: ', file.id);
        }
      });
    }


 类似资料:
  • 问题内容: 我的应用程序可与Google Drive Java API一起使用。 我只想在Google云端硬盘的根目录下创建文件夹。我正在使用下面的代码来创建文件夹。 如何检查根文件夹中的文件夹是否存在。我只有文件夹名称“ Myapp”,没有实例ID。 问题答案: 现在,您可以浏览“文件”中的所有文件夹,并检查是否有任何文件夹具有搜索的标题。 不要忘了通过以下方式遍历所有页面: 编辑: 也许你可以

  • 试图通过Google Drive的API V3向一个文件添加权限,我遇到了下面的错误。我希望允许来自我的站点MTA.IO的请求能够读取该文件。这个错误似乎来自于我在请求正文中传递的域。例如,example.com工作正常,权限被授予。我是否需要将我的域列入白名单以便授予它对该文件的权限? 作品: 我正在使用API站点上的try it特性。

  • 问题内容: 我想在Google云端硬盘中创建一个空的Google表格(仅使用元数据创建)。当我提到Google SpreadSheet API 文档时,它说要使用DocumentsList API,但已弃用,而是要求我使用Google Drive API。在云端硬盘API文档中,我找不到创建空工作表的任何方法。有人知道如何执行此操作吗? 问题答案: 您可以使用做这个驱动器的API被设置MIME类型

  • 问题内容: 我在Google云端硬盘中有一个文件夹想要嵌入到我的网站中。我找不到嵌入代码或Google云端硬盘帮助文章中记录的任何内容。 问题答案: Google云端硬盘文件夹可以嵌入并显示在和视图中: 列表显示 网格视图 问 :什么是文件夹ID(FOLDER-ID),如何获取? 答 :转到Google云端硬盘>>打开文件夹>>在浏览器地址栏中查看其URL。例如: 请注意需要许可的文件夹 此技术最

  • 问题内容: 我遵循以下文档以将文件上传到Google云端硬盘:https : //developers.google.com/drive/android/files 现在,每次我要上传文件时,都会出现Google云端硬盘的弹出窗口,问我将其上传到哪里以及哪个名字。我不希望弹出窗口,我想直接上传文件。 有什么方法可以做到这一点?我找不到任何文档。我也发现了这一点:https : //develope

  • 问题内容: 我正在尝试授权我的应用程序与Google云端硬盘集成。Google文档提供了有关基于服务器的授权的详细信息以及各种服务器技术的代码示例。 还有一个JavaScript Google API库,该库支持授权。在Wiki的示例部分下方有一个代码片段,用于创建配置和调用authorize函数。我将范围更改为我认为需要驱动器的范围: 永远不会调用该回调函数(是的,已更正了GoogleAPI库的