作为服务帐户向 Google API 进行身份验证时是否需要刷新“访问令牌”?

问题描述 投票:0回答:1

我正在 Google AppEngine 上编写一个 NodeJS 应用程序,它使用服务帐户 (SA) 调用 Google API(特别是 Drive API)来访问资源。在使用 OAuth2 之前,我已经访问过 Google API,但通常是针对 Workspace 中的实际最终用户。因此,我最熟悉刷新令牌和访问令牌的概念,其中短期访问令牌应在过期(约 1 小时)时通过使用刷新令牌进行更新。

通过服务帐户访问对我来说是新的。据我了解,不需要刷新令牌(实际上没有提供刷新令牌)。只要 SA 的 OAuth 访问令牌过期(也是 1 小时),您只需重新进行身份验证。但我不知道如何(1)获取并缓存访问令牌和关联的凭据,以及(2)告诉它们何时过期,以便我可以在必要时刷新它们。

我确实使用下面的代码使我的云端硬盘访问工作正常,但我担心的是,该代码基本上每次调用它时都会获取/刷新新令牌,而不是仅在之前获得的凭据已过期时才这样做。这不是最佳实践,而且我还担心,从长远来看,如果我的应用程序开始获得大量流量,谷歌可能不会喜欢这样。

如果您能帮助我弄清楚如何正确执行此操作,或者我实际上对当前的方法感到满意并且不需要更改任何内容,我将不胜感激。

`// Get latest access credentials to pass to Google Drive API via 'auth' param.
// Takes as input 'saKey', which has service account's email & private key (loaded elsewhere)
async function getAccessCreds(saKey) {
  let googleAuth;
  let authClient;

  // Returns a GoogleAuth object:
  //    https://cloud.google.com/nodejs/docs/reference/google-auth-library/latest/google-auth-library/googleauth
  googleAuth = new GoogleAuth({
    credentials: {
      client_email: saKey.client_email,
      private_key: saKey.private_key,
    },
    scopes: 'https://www.googleapis.com/auth/drive.readonly'
  });

  // call googAuth.getClient() which returns a JWT object (?):
  //   https://cloud.google.com/nodejs/docs/reference/google-auth-library/latest/google-auth-library/jwt
  authClient = googleAuth.getClient();

  return authClient;
}

let saKey = loadSAKey();

let accessCreds = await getAccessCreds(saKey);

// Call Drive API
drive.files.get(
      { auth:accessCreds, fileId: fileId, alt: 'media' },
      { responseType: 'stream' }
).then(...)
`

如上所述,他的代码按照编写的方式工作,我只是不确定它是否是最佳实践或可扩展的。

google-oauth service-accounts google-api-nodejs-client
1个回答
0
投票

您正在使用 google apis node.js 客户端库,该库由 google 创建,旨在为您处理所有授权。

就服务帐户而言,他们会在需要时获取授权,并且再次由图书馆为您处理。

© www.soinside.com 2019 - 2024. All rights reserved.