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

我正在尝试通过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);

}

});

}

以上是 尝试通过API(v3)在Google云端硬盘上创建文件夹时权限不足 的全部内容, 来源链接: utcz.com/qa/412401.html

回到顶部