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

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

问题描述

我正在尝试通过API在Google云端硬盘上创建一个文件夹.我正在使用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.

要进行设置,我已根据文档的快速入门指南创建了一个项目.我的设置看起来与该样板基本相同,只是删除了读取云端硬盘中文件的功能.但是,当尝试使用文档中给出的示例上传 时,我得到了错误:Insufficient Permission.

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的googleapi存在一些错误.因此,请确认您的版本,以防万一.我使用的是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云端硬盘上创建文件夹时权限不足的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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