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

2024-01-03

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

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

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

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("[email protected] /cdn-cgi/l/email-protection");

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

在查看文档时nodejs-client for 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'],
});

and

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
});

有什么区别GoogleAuth and OAuth2 here?

如何设置一切以便我的 Node.js 应用程序可以访问[email protected] /cdn-cgi/l/email-protection通过服务帐户发送邮件?

我如何指定email我想通过以下方式访问service account?


The 文档 https://github.com/googleapis/google-api-nodejs-client#application-default-credentials指定:

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

换句话说:

  • google.auth.GoogleAuth是一个库工具,如果您不知道需要哪些凭据,它可以动态地为您创建正确的凭据
  • google.auth.OAuth2始终创建专门的 OAuth2 凭据
  • 对于大多数以您自己身份进行身份验证的应用程序,您需要 OAuth2
  • 但是,要使用服务帐户,您需要创建一个JSON Web Token指定的here https://github.com/googleapis/google-auth-library-nodejs#json-web-tokens
  • 仔细检查您是否创建了服务帐户凭据 https://cloud.google.com/iam/docs/creating-managing-service-account-keys#creating_service_account_keys,最好作为json文件,已启用域范围的委派 https://developers.google.com/admin-sdk/directory/v1/guides/delegation并向服务帐户提供必要的scopes https://support.google.com/a/answer/162106?hl=en在管理控制台中。
  • 要在代码中实现模拟,请添加以下行subject: USER_EMAIL创建 JWT 客户端时。

Sample

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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 为什么经典的 ASP 服务器端包含包含在注释中?

    为什么服务器端包含的语法是 将语义上有意义的内容放在注释中似乎很尴尬且具有误导性 事实上 当我第一次看到这种语法时 我认为它是一个已被 注释掉 的包含内容 设计语言使用这种语法而不是像这样的替代方案背后的原因是什么 我知道用简单的替换来解析
  • 从服务器发送文件到客户端(python)

    我目前正在编写一个服务器客户端应用程序 需要传输一些文件才能工作 我正在使用这个方法 client file to send raw input gt try f open sent files file to send rb except
  • 如何避免工具提示中出现阴影?

    我开发了一个 ToolTip 控件 并将其注册为 ToolTip 代码如下 protected override CreateParams CreateParams get CreateParams param base CreatePar
  • Rails - 警告:无法批量分配受保护的属性

    从这里继续 Rails 表单问题 https stackoverflow com questions 6058486 rails form problems 每次我尝试创建一个新的group membership我明白了 WARNING C
  • Rails db:种子错误“未定义方法‘finder_needs_type_condition?’对于 nil:NilClass"

    我在尝试填充 sqlite 数据库时遇到问题 关于特定错误 finder needs type condition 的信息不多 我可以找到 但我没有太多使用 Rails 的经验 甚至怀疑问题可能出在哪里 Model class Charac
  • 如何使用Android相机获取全分辨率和未压缩的图像数据?

    我想获得全分辨率 而不是压缩 图像数据 然后我可以进行一些图像处理 据我所知 android api takePicture shutter raw jpg 可以做一些事情 但是我需要的不是压缩的 JPEG 数据 而是未压缩的图像数据 而且
  • 有没有 StringUtils.isNumeric 的替代方案可以实现我的意思?

    StringUtils isNumeric 对于 返回 true 对于 7 8 返回 false 这当然是有记录的行为 但对我来说确实不是最方便的 还有其他东西 最好是在 commons lang 中 提供 isActuallyNumeri
  • 如何降低firebase实时数据库下载成本? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在firebase实时数据库中制作2个数据库是否有助于降低成本并增加每天360MB的每日下载限制 降低成本最简单的方法是减少下载 你可
  • 在 JasperReports 中进行比较 if else

    我想做一个比较 例如 if
  • Order by 不适用于 LINQ 中的 Concat()

    使用 VB net 和以下 LINQ 语句 我怀疑 排序依据 不适用于Concat 我想列出用户当前拥有的项目 然后按升序列出更多可用项目 因此 首先我从数据库中选择当前项目 然后按顺序选择下一个可用项目 LINQ 忽略 order by
  • 如何在 Mac 上将 localhost 绑定到 127.0.0.1? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的本地计算机上有一个正在运行的 Web 应用程序 要访问它 我可以使用localhost 8080 但是当我尝试使用http 127 0
  • MVC3中提交数据库数据后如何清除模型

    我正在数据库中提交一些数据 提交后我想显示同一页面 但我正在查看页面 文本框值不为空 ModelState Clear 我曾经用来清除文本框 但文本框值仍然保留 请建议我在mvc3中提交后清除模型 public ActionResult A
  • 重置 DBUnit 中的序列?

    我想在 Java DBUnit 中的每次测试后重置数据库 AND 序列 我已经看到这个问题 但没有我正在努力获得的代码解决方案 如何在DBUnit中使用Oracle序列号 https stackoverflow com questions
  • 在 ruby​​ 类中调用 Knife

    我想围绕刀创建一个很好的包装类 以允许程序以可读的方式运行刀命令 我目前正在尝试使用 Chef gem 中的 Knife rb 文件作为取得成功的指南 但是 我在关闭编辑器时遇到问题 如果我运行以下代码 require chef knife
  • 过滤数据集

    我有一个充满客户的数据集 我想知道是否有任何方法可以过滤数据集并仅获取我想要的信息 例如 要得到CostumerName and CostumerAddress对于有的客户CostumerID 1 是否可以 您可以使用DataTable S
  • Twitter Bootstrap - 如何根据 @media 定义的宽度更改 css 类

    这是我的第一个问题 但我只想说这个网站多年来帮助了我无数次 我想我已经到了有自己的问题要问的阶段了 抱歉 如果问题不清楚 我会尝试详细说明 我已经为我的一些元素分配了一个过渡 这样当它们悬停在上面时它们就会向上升起 即 example ho
  • Python 使用 Beautiful Soup 对特定内容进行 HTML 处理

    所以当我决定解析网站的内容时 例如 http allrecipes com Recipe Slow Cooker Pork Chops II Detail aspx http allrecipes com Recipe Slow Cooke
  • 如何在 Python 中处理命令行参数? [复制]

    这个问题在这里已经有答案了 如果我期望像 001 或 999 这样的东西 这次让我们将期望限制在 001 999 范围 并且传递的其他参数很少 并且希望忽略任何意外的参数 那么处理命令行参数的简单表达式是什么 我知道 例如 如果我需要查明
  • Facebook 身份验证对话框(JS SDK)返回空白屏幕

    我正在设置一个 Rails 应用程序并尝试通过 Facebook JS SDK 实现登录 已经缺少 Omniauth 无论如何 发生的情况是弹出对话框 用户提供登录信息 但随后它重定向到https www facebook com conn
  • 如何使用服务帐户访问 GSuite 电子邮件帐户的 GMAIL API

    我希望我的服务帐户能够模拟 GSuite 中的用户之一 我有 通过 GCP 创建项目 在项目中启用GMail API 向该项目添加了一个服务帐户 启用了domain wide delegation在服务帐户设置中GCP 添加了一个API C