【问题标题】:Authenticate GMail API without user intervention in Google Cloud Function无需用户干预即可在 Google Cloud Function 中验证 GMail API
【发布时间】:2020-03-20 04:40:34
【问题描述】:

我是新手,请多多包涵。

我正在尝试设置一个 Google Cloud Function,它可以访问同一域中的单个 GMail 帐户,下载一些电子邮件并将它们推送到 Cloud Storage。老实说,我只想在脚本中使用电子邮件和密码(使用 Google KMS /w 环境变量?),但我知道这是不可能的,并且需要 OAuth2。

我在 GCP 中设置了 OAuth 客户端,并运行了 GMail API Python Quickstart 指南。在本地运行它会提示我允许访问,并保存令牌,以便后续运行无需提示。

我使用 pickle 文件部署了 Cloud Function,以测试刷新令牌是否仍然有效,并计划在以后弄清楚如何使用 KMS 来提高安全性。但是加载泡菜时出现问题:

UnpicklingError: invalid load key, '\xef'

这使得泡菜在上传时看起来像是被压缩/损坏。

这甚至是一种理智的方法吗?我怎么能这样做?电子邮件地址是我的,所以我希望我可以验证一次并完成它。

顺便说一句,我不能使用域委派的服务帐户,也不能使用 IMAP。

【问题讨论】:

  • 如果我总结一下,您想知道存储令牌的最佳安全方法是什么?
  • @guillaumeblaquiere 如何在本地转储令牌,安全地存储它并从该令牌进行身份验证会很棒。或者当通过 HTTP 调用 Cloud Function 时可能重定向到 Google OAuth 进程?然后在第一次通话后存储它。那太好了。
  • 不确定这里的问题是什么 :-) 如果您不想打扰 OAuth dance,您应该使用 API 工具(如 Bearer.sh)来处理为您进行身份验证。

标签: python oauth-2.0 google-cloud-functions gmail-api


【解决方案1】:

由于您无法进行域委托服务帐户,您可以尝试按照本指南设置server side authorization。这听起来像您想要的,因为它要求用户授权应用程序一次,然后重用该令牌。这是一个codelab,它将带您完成身份验证部分。

或者,您可以使用推送通知。听起来您当前的设计是定期轮询 Gmail API 以查找新电子邮件,这还涉及授权访问 Cloud Function 中的帐户。但是,如果您利用 Push Notifications,您既可以实时获取数据,又无需授权 Cloud Function 读取 Gmail API。 See guide here.

然而,最简单的解决方案可能是使用app scripts。如果您将云功能设置为通过 HTTP 目标触发,您可以编写一个应用程序脚本来 ping 该 URL 以及您想要发送到 GCS 的消息。 Docs here

function getEmails() {
  let inbox = GmailApp.getInboxThreads(0, 50);
  // Inbox Threads
  for (i=0; i < inbox.length; i++){ 
    let threadMessages = inbox[i].getMessages();
    // Thread Messages
    for (j=0; j < threadMessages.length; j++){
      let message = threadMessages[j].getBody();
      let subject = threadMessages[j].getSubject();

      var options = {
        'method' : 'post',
        'contentType': 'application/json',
        'payload' : JSON.stringify({"message": message, "subject": subject})
    };
     UrlFetchApp.fetch('YOUR_FUNCTION_TRIGGER_URL', options);
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 2020-08-15
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多