Получение 403 от Google Drive API - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь получить доступ к Google Drive с помощью клиента узла . Это будет выполняться на сервере в фоновом режиме без участия пользователя. При подготовке я сделал следующее:

  • Создан сервисный аккаунт
  • Включено Доступ к Drive API для учетной записи, чей диск я получаю
  • Предоставил общий доступ к определенной папке на диске с учетной записью службы (именуемой MyFolder ниже).

Я могу успешно пройти проверку подлинности в качестве учетной записи службы и списка файлов в каталоге. Однако я не могу загрузить ни один из файлов. Когда я пытаюсь, я, очевидно, получаю ошибку 403. Это как бы скрыто в сообщении об ошибке, но, похоже, это проблема. Вот мой код:

const fs = require('fs');
const { google } = require('googleapis');
const auth = require('./service-creds.json');

(async () => {
    let jwtClient = new google.auth.JWT(auth.client_email, null,
        auth.private_key, ['https://www.googleapis.com/auth/drive']);

    try {
        const tokens = await jwtClient.authorize();
        let drive = google.drive('v3');

        const res1 = await drive.files.list({
            auth: jwtClient, q: `name = 'MyFolder'`
        });

        const folder = res1.data.files[0];

        const res2 = await drive.files.list({
            auth: jwtClient,
            q: `'${folder.id}' in parents`
        });

        // print out all files under MyFolder
        res2.data.files.forEach(f => console.log(f.name, f.id));

        const dest = fs.createWriteStream('./myfile.csv');
        const file = res2.data.files[0];

        const response = await drive.files.export({
            fileId: file.id,
            mimeType: file.mimeType,
            auth: jwtClient
        }, {
            responseType: 'stream'
        });

        response.data.on('error', err => {
            console.log(err);
        }).on('end', () => {
            console.log('done');
        }).pipe(dest);
    }
    catch (err) {
        console.log('The API returned an error: ', err);
    }
})();

Вот часть полученной ошибки:

The API returned an error:
... at Gaxios.<anonymous> (/api-test/node_modules/gaxios/build/src/gaxios.js:73:27)

 Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: 
   { body: 
      Gunzip {
        _readableState: [Object],
        readable: true,
        domain: null,
        _events: [Object],
        _eventsCount: 7,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: true,
        allowHalfOpen: true,
        _transformState: [Object],
        bytesRead: 0,
        _opts: [Object],
        _chunkSize: 16384,
        _flushFlag: 2,
        _finishFlushFlag: 2,
        _scheduledFlushFlag: 0,
        _handle: [Object],
        _hadError: false,
        _buffer: <Buffer 00 00 00 00 00 00 00 00 34 00 00 00 00 00 00 00 ... >,
        _offset: 0,
        _level: -1,
        _strategy: 0 },
     disturbed: false,
     error: null },
  [Symbol(Response internals)]: 
   { url: 'https://www.googleapis.com/drive/v3/files/123abc123abc/export?mimeType=text%2Fplain',
     status: 403,
     statusText: 'Forbidden',
     headers: Headers { [Symbol(map)]: [Object] },
     counter: 0 } }

Я не смог найти ничего в ошибке, в которой говорится, почему 403 выбрасывается. Похоже, что он заархивирован, но я не смог успешно разархивировать его часть.

1 Ответ

1 голос
/ 08 мая 2019
  • Вы хотите загрузить файл text/plain с Google Диска.

Если мое понимание правильное, как насчет этой модификации?

Точки модификации:

  • Я думаю, что причиной вашей проблемы является загрузка файла mimeType text/plain с помощью метода files.export Drive API.
    • При загрузке файлов Документов Google (электронных таблиц, документов, слайдов и т. Д.) Это можно сделать с помощью метода files.export Drive API.
    • Когда вы хотите загрузить файлыкроме Google Docs, используйте метод files.get.
    • Когда я попытался загрузить файл text/plain с помощью метода files.export, я мог подтвердить, что возникает та же ошибка.

Чтобы отразить вышеуказанные пункты, измените их следующим образом.

Модифицированный скрипт:

От:
const response = await drive.files.export({
    fileId: file.id,
    mimeType: file.mimeType,
    auth: jwtClient
}, {
    responseType: 'stream'
});
До:
const response = await drive.files.get({
    fileId: file.id,
    alt: "media",
    auth: jwtClient
}, {
    responseType: 'stream'
});

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...