Google 无需用户登录的身份验证仅供服务器端使用

Google authentication without user login for server-side use only

我正在尝试实施 Google 驱动器 API,仅供后端使用。用户将不会登录到该站点。我只是想从服务器获取我自己的 Drive 帐户的访问令牌,而不需要经常登录。这仅供后台进程使用,用户永远不会真正与之交互。

我已经启用了云端硬盘 API 并为其创建了应用服务凭证,并且我有 secret.json 文件用于验证。然而,Google 的文档似乎只是简单地提到了几次无用户服务器端身份验证,然后就把它蒙住了。我找不到任何关于如何通过这种方式进行身份验证的官方文档。

我正在关注 the official node.js example,但它仍然需要您打开一个页面进行身份验证。这是我需要的吗?由此授予的令牌是否会过期?

您需要继续登录的原因是 Google 驱动器 Api 使用具有超时期限的会话 cookie。这是为了防止 cookie 被窃取,尤其是当您要允许用户使用此数据时。

解决方法:

根据您的情况,我认为使用的是 OAuth2。这样,当检索到刷新令牌和访问令牌时,需要浏览器授权范围。这是 Google 端的当前规范。在这种情况下,访问令牌和刷新令牌的到期时间分别为 1 小时和六个月。 Ref

当您想在不使用浏览器的情况下使用云端硬盘 API 时,作为解决方法,使用服务帐户而不是 OAuth2 怎么样? service account取回的access token虽然有1个小时的过期时间,但是在使用service account的时候,Drive API不需要用浏览器打开取回授权码的页面就可以使用[=16] =]

Node.js使用服务帐号的googleapis示例脚本如下。

示例脚本:

在此示例脚本中,检索服务帐户的 Google 驱动器的文件列表。 serviceAccount.json 是包含通过创建服务帐户检索到的 JSON 对象的文件。

const { google } = require("googleapis");
const key = require("./serviceAccount.json");
const client = new google.auth.JWT(
  key.client_email,
  null,
  key.private_key,
  ["https://www.googleapis.com/auth/drive.readonly"],
  null
);

client.authorize((err) => {
  if (err) {
    console.log(err);
  }
});
drive = google.drive({ version: "v3", auth: client });
drive.files.list(null, (err, res) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(res.data);
});

注:

  • 作为使用服务帐户的重要一点,服务帐户的 Google 驱动器与您帐户的 Google 驱动器不同。因此,例如,当您要使用服务帐户检索文件时,有以下 2 种方法。
    1. 使用服务帐户的电子邮件地址共享文件。
    2. 在您的 Google 驱动器中创建一个文件夹,并与服务帐户的电子邮件地址共享该文件夹。然后,文件被放入文件夹。这样,就可以用服务账号找回文件了。

参考文献: