如何使用服务帐户为 GSuite 电子邮件帐户访问 GMAIL API

How to use Service Account to access GMAIL API for a GSuite email account

我希望我的服务帐户能够模拟 GSuite 中的一位用户。 我有

在浏览文档 (java) 时,我看到了这个

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("user@example.com");

他们在此处指定服务帐户应模拟哪个用户。此代码在 java 中。我需要在 nodejs 中完成同样的事情。

在查看 googleapisnodejs-client 文档时,我发现了这个:

const {google} = require('googleapis');

const auth = new google.auth.GoogleAuth({
  keyFile: '/path/to/your-secret-key.json',
  scopes: ['https://www.googleapis.com/auth/cloud-platform'],
});

const {google} = require('googleapis');

const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// set auth as a global default
google.options({
  auth: oauth2Client
});

这里的GoogleAuthOAuth2有什么区别?

如何设置所有内容以便我的 node.js 应用程序可以通过服务帐户访问 user@abc.xyz 邮件?

如何指定我想通过 service account 访问的 email

documentation 指定:

Rather than manually creating an OAuth2 client, JWT client, or Compute client, the auth library can create the correct credential type for you, depending upon the environment your code is running under.

换句话说:

  • google.auth.GoogleAuth 是一个库工具,如果您不知道需要哪些凭据,它可以为您动态创建正确的凭据
  • google.auth.OAuth2 始终专门创建 OAuth2 凭据
  • 对于您以自己身份进行身份验证的大多数应用程序,您需要 OAth2
  • 但是,要使用服务帐户,您需要创建一个 JSON Web Token 指定的 here
  • 仔细检查您是否在管理控制台中创建了 service account crendetials, preferably as a json file, enabled domain-wide delegation and provided the service account with the necessary scopes
  • 要在您的代码中实现模拟,请在创建 JWT 客户端时添加行 subject: USER_EMAIL

示例

const {JWT} = require('google-auth-library');
//THE PATH TO YOUR SERVICE ACCOUNT CRENDETIALS JSON FILE
const keys = require('./jwt.keys.json');

async function main() {
  const client = new JWT({
    email: keys.client_email,
    key: keys.private_key,
    scopes: ['YOUR SCOPES HERE'],
    subject: USER_EMAIL
  });
  const url = `https://dns.googleapis.com/dns/v1/projects/${keys.project_id}`;
  const res = await client.request({url});
  console.log(res.data);
}

main().catch(console.error);