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

Aks*_*hay 3 node.js google-api-client google-api-nodejs-client gmail-api

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

  • 通过 GCP 创建项目
  • 在项目中启用GMail API
  • 向该项目添加了一个服务帐户
  • domain-wide delegation在服务帐户设置中启用GCP
  • 通过 Google 管理控制台在高级设置中API Client添加了service account idGSuite

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

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

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

在查看nodejs-clientfor的文档时googleapis,我发现了这一点:

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'],
});
Run Code Online (Sandbox Code Playgroud)

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
});
Run Code Online (Sandbox Code Playgroud)

GoogleAuth和这里有什么区别OAuth2

如何设置一切,以便我的 Node.js 应用程序可以user@abc.xyz通过服务帐户访问邮件?

如何指定我email要访问的方式service account

zig*_*hka 7

文档指定:

身份验证库可以根据代码运行的环境为您创建正确的凭据类型,而不是手动创建 OAuth2 客户端、JWT 客户端或计算客户端。

换句话说:

  • google.auth.GoogleAuth是一个库工具,如果您不知道需要哪些凭据,它可以动态地为您创建正确的凭据
  • google.auth.OAuth2始终创建专门的 OAuth2 凭据
  • 对于大多数需要您进行身份验证的应用程序,OAth2 正是您所需要的
  • 但是,要使用服务帐户,您需要在此处JSON Web Token创建一个指定的
  • 仔细检查您是否创建了服务帐户凭据(最好是作为json文件)、启用了域范围委派并在管理控制台中为服务帐户提供了必要的范围。
  • 要在代码中实现模拟,请subject: USER_EMAIL在创建 JWT 客户端时添加以下行。

样本

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);
Run Code Online (Sandbox Code Playgroud)