python - 将 Google EmailSettings API python 代码从 OAuth1 移动到 OAuth2 服务帐户

标签 python oauth google-api google-email-settings-api

为了使用新的 Google Directory API,我们创建了一个 OAuth2“服务帐户”(请参阅​​ Using OAuth 2.0 for Server to Server Applications)。这基本上是一个 PKCS #12 文件。我们所有的目录 API 脚本都可以与此服务帐户一起正常工作。

我们还使用 EmailSettings API ( Developer's Guide Email Settings API ) 来管理我们的一些 Google 帐户设置。这些脚本没有迁移到新的 API 格式,因此我们继续使用旧的 OAuth1 身份验证方法。直到最近,这种方法一直运行良好。但是,Google 似乎不再支持 OAuth1 身份验证。

因此,我们需要将 EmailSettings 脚本从 OAuth1 移动到我们的 OAuth2 服务帐户。我们使用 gdata Python 库 ( GitHub google/gdata-python-client ) 来调用 EmailSettings API。这是我们目前进行 EmailSettings API 调用的身份验证方式:

import gdata.apps.emailsettings.service
# self is an EmailSettingsService object (gdata.apps.emailsettings.service)
self.domain = "mydomain.com"
self.source = "my application name"
token = get OAuth1 token string from a file
self.SetOAuthInputParameters(
  gdata.auth.OAuthSignatureMethod.HMAC_SHA1,
  consumer_key    = token.oauth_input_params._consumer.key,
  consumer_secret = token.oauth_input_params._consumer.secret
  )
token.oauth_input_params = self._oauth_input_params
self.SetOAuthToken(token)

使用这些 Python gdata 库,如何使用我们的 OAuth2 服务帐户(即 PKCS #12 文件)进行身份验证,以使用 EmailSettings API?

最佳答案

another SO question它向您展示了如何执行此操作,但使用了稍微较新的 gdata.apps.emailsettings.client 方法。

如果您必须继续使用 gdata.apps.emailsettings.service,那么您可以使用以下内容“破解”OAuth 2.0 到对象上:

  1. 构建您的 OAuth 2.0 credentials 对象,就像您为 Admin SDK Directory API 调用所做的那样。

  2. 按照代码第 1-3 行中的操作构建 GData 客户端对象。

  3. 从您的凭据对象中获取访问 token 并将其作为 header 应用到您的客户端对象:

    client.additional_headers = { '授权':u'承载%s'%凭据.access_token}

如果您收到 401 响应(访问 token 已过期),请重复 1 和 3 以获取并应用新的访问 token 。

关于python - 将 Google EmailSettings API python 代码从 OAuth1 移动到 OAuth2 服务帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30283473/

相关文章:

javascript - 身份验证后 Yahoo API 出现问题

android - Google Books API 403 访问未配置

javascript - 验证服务帐户以使用 JavaScript 客户端库调用 Google API

python - 无法使用 rauth 库访问 LinkedIn 连接

python - 如何将 Cython 生成的模块从 python 导入到 C/C++ 主文件? (使用 C/C++ 编程)

python - pyqt QObject : Cannot create children for a parent that is in a different thread

google-api - 通过 API 对 Google 文档的 ACL 请求进行批处理相当慢

javascript - 保存到驱动器按钮光标

python - python 中的 numpy var() 和 statistics variance() 有什么区别?

python - 如何在 PyCharm 中出现错误后打印 Python 变量?