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

Move Google EmailSettings API python code from OAuth1 to OAuth2 service account

为了使用新的 Google 目录 API,我们创建了一个 OAuth2 "service account"(参见 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,那么您可以 "hack" OAuth 2.0 到 object 上,像这样:

  1. 构建您的 OAuth 2.0 credentials object 正如您已经在为 Admin SDK 目录 API 调用所做的那样。

  2. 构建您的 GData 客户端 object,就像您在代码的第 1-3 行中所做的那样。

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

    client.additional_headers = { 'Authorization': u'Bearer %s' % credentials.access_token}

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