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 种方法。
- 使用服务帐户的电子邮件地址共享文件。
- 在您的 Google 驱动器中创建一个文件夹,并与服务帐户的电子邮件地址共享该文件夹。然后,文件被放入文件夹。这样,就可以用服务账号找回文件了。
参考文献:
我正在尝试实施 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 种方法。
- 使用服务帐户的电子邮件地址共享文件。
- 在您的 Google 驱动器中创建一个文件夹,并与服务帐户的电子邮件地址共享该文件夹。然后,文件被放入文件夹。这样,就可以用服务账号找回文件了。