Google 驱动器 API 在获取文件时说 "Forbidden"

Google Drive API Says "Forbidden" When Fetching File

出于某种原因,我想从 google 驱动器获取文件并在服务器上处理它。我从选择器中获取 FileID 并将其发送到后端以供下载和处理。因此,在使用 googleapi 下载文件时,出现此错误

先决条件

  1. 驱动器 API 在项目中启用
  2. Access Token 拥有 Drive 的权限

我尝试过的权限

  1. https://www.googleapis.com/auth/drive.readonly
  2. https://www.googleapis.com/auth/drive.file
  3. https://www.googleapis.com/auth/drive

我使用的代码来自GitHub

const tmpDir = path.resolve(path.join(os.tmpdir(), "user-sheets"));
const file = path.join(tmpDir, Date.now().toString());

let stream = fs.createWriteStream(file);
let drive = google.drive({
    version: "v3",
    auth: "MY ACCESS TOKEN",
});

drive.files
    .get(
        {
            fileId: req.body.url,
            alt: "media",
            oauth_token: "MY ACCESS TOKEN",
        },
        {
            responseType: "stream",
        }
    )
    .then((r) => {
        r.data
            .on("end", async () => {
                console.log("ended");
                stream.close();
            })
            .on("error", function (err) {
                console.log("Error during download", err);
                res.json({
                    success: false,
                    message: "Something went wrong",
                    error: err,
                });
            })
            .pipe(stream);
    })
    .catch((e) => {
        console.error(e.response);
    });

在这个回答中,我推测有以下几点。

  • MY ACCESS TOKEN of auth: "MY ACCESS TOKEN", 是下载文件的有效访问令牌。
  • req.body.url of fileId: req.body.url, 是不是 URL.
  • 的文件 ID

如果我的猜测不正确,请告诉我。

如果我的猜测是正确的,请确认以下修改。

修改点:

  • 很遗憾,MY ACCESS TOKEN 不能直接用于 google.drive()drive.files.get()

当这一点反映到你的脚本中,就变成了下面这样。

修改后的脚本:

从:
let drive = google.drive({
    version: "v3",
    auth: "MY ACCESS TOKEN",
});

drive.files
    .get(
        {
            fileId: req.body.url,
            alt: "media",
            oauth_token: "MY ACCESS TOKEN",
        },
        {
            responseType: "stream",
        }
    )
到:
var oauth2Client = new google.auth.OAuth2();
oauth2Client.setCredentials({access_token: "MY ACCESS TOKEN"});
const drive = google.drive({
  version: "v3",
  auth: oauth2Client,
});
drive.files
  .get(
    {
      fileId: req.body.url,  // Please use the file ID here.
      alt: "media",
    },
    { responseType: "stream" }
  )

注:

  • 在这种情况下,可以下载除Google文档文件(Google文档、Google电子表格、Google幻灯片等)之外的文件。请注意这一点。

参考: