尝试通过 API(v3)在 Google Drive 上创建文件夹时权限不足 [英] Insufficient Permission when trying to create a folder on Google Drive via API(v3)

查看:16
本文介绍了尝试通过 API(v3)在 Google Drive 上创建文件夹时权限不足的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过 API 在我的 Google Drive 上创建一个文件夹.我正在使用 Node,并创建了一个脚本来获取每日报告,并希望通过 API 创建一个文件夹并将这些文件每天上传到它.

I am trying to create a folder on my Google Drive via the API. I am using Node, and have created a script that fetches a daily report and would like to via the API, create a folder and upload those files to it daily.

为了设置,我根据文档的 快速入门指南创建了一个项目.我的设置看起来与样板基本相同,但减去了读取 Drive 中文件的功能.但是,当尝试上传 使用文档中给出的示例时,我得到了错误:权限不足.

To setup, I have created a project per the doc's quick start guide. My setup looks basically the same as that boilerplate minus the function that reads the files in Drive. However, when trying to upload using the example given in the docs I get the error: Insufficient Permission.

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

Going through the permissions in the project's interface, there are a bunch of roles to choose from. Currently I have assigned my project as a Folder Administrator (as well as a couple other roles), which should give me permissions yet I am still confronted with this error. Perhaps I need to regenerate my client_secret.json file to reflect my updated permissions but how do I do that? I have been googling and poking around the interface for quite some time but see no way to regenerate this file.

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

The code I am using to create a folder looks like this, pretty close to the boilerplate given in the doc's - just to see it work:

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)

推荐答案

我认为你的脚本有效.那么您能否再次确认以下几点?

I think that your script works. So can you confirm the following points again?

  1. 关于范围.
    • 在快速入门中,默认范围是 var SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'];.但要使用 drive.files.create,需要将 https://www.googleapis.com/auth/drive 添加到作用域中.
    • 如果你修改了范围,请删除drive-nodejs-quickstart.json的文件.并运行脚本.这样,授权就会运行,并且添加的范围会反映到刷新令牌和访问令牌中.
  1. About the scope.
    • At Quickstart, the default scope is var SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'];. But in order to use drive.files.create, https://www.googleapis.com/auth/drive is required to be added to the scopes.
    • If you modified the scope, please remove the file of drive-nodejs-quickstart.json. And run the script. By this, the authorization is run and the added scopes are reflected to the refresh token and access token.
  • 最近有消息称,v27.0.0、v26.0.1、v25.0.0的googleapis存在一些bug.因此,请确认您的版本以防万一.我使用 v24.0.0.
  • 关于这个,我认为从你的问题来看,你可能已经启用了.

如果这些对你没有用,我很抱歉.

If these were not useful for you, I'm sorry.

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);
        }
      });
    }

这篇关于尝试通过 API(v3)在 Google Drive 上创建文件夹时权限不足的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆