在GAE SDK的dev_appserver中,使用服务账号的P12密钥

比如,在搭建Cloud Endpoints的API层之前,如果要连接GAE SDK的dev_appserver与BigQuery,那么就会有这样的需求。

在开发者控制台上创建服务帐号时,会下载P12密钥。
P12密钥是以PKCS12格式的秘密钥匙。

oauth2client在使用的PyCrypto不支持PKCS12格式。
如果直接使用它,

NotImplementedError: PKCS12 format is not supported by the PyCrypto library. Try converting to a "PEM" (openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem) or using PyOpenSSL if native code is an option.

只需要一个选项

由于发生了NotImplementedError错误,因此只需按照消息提示来转换私钥即可。

$ openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem
Enter Import Password:

服务账户的秘钥密码是固定的,设定为”notasecret”。

代码示例

# -*- coding: utf-8 -*-

import os

from google.appengine.api import memcache
import apiclient
import httplib2
import oauth2client

# OAuth2.0のSCOPEを列挙する。
# 例) https://cloud.google.com/bigquery/authentication#oauthbasics
BigQuery_SCOPE = ('https://www.googleapis.com/auth/bigquery',)

def get_bigquery_client():
  # dev_appserverで実行しているか、判定する。環境変数`SERVER_SOFTWARE`が`Dev`から始まる。
  if os.environ.get('SERVER_SOFTWARE', 'Dev').startswith('Dev'):
    # PEMファイルを読み取り専用で開く。
    with open('privatekey.pem', 'rb') as f:
      # Credentials object used for OAuth 2.0 Signed JWT assertion grants.
      # http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.client.SignedJwtAssertionCredentials-class.html
      credentials = oauth2client.client.SignedJwtAssertionCredentials(
        service_account_name = '...@developer.gserviceaccount.com',
        private_key = f.read(),
        scope = BigQuery_SCOPE,
      )
  else:
    # Credentials object for App Engine Assertion Grants
    # http://google-api-python-client.googlecode.com/hg/docs/epy/oauth2client.appengine.AppAssertionCredentials-class.html
    credentials = oauth2client.appengine.AppAssertionCredentials(scope=BigQuery_SCOPE)
  # キャッシュ利用にmemcacheを設定したHTTPクライアント。
  http = credentials.authorize(httplib2.Http(memcache))
  # Google Cloud Endpointsを指定して、APIクライアントを返す。
  return apiclient.discovery.build('bigquery', 'v2', http=http)

常见的错误

IO错误:[Errno 13] 文件无法访问:’privatekey.pem’

由于只能访问GAE项目下的文件,因此将密钥移动到GAE项目下的目录中。

数值错误:不支持RSA密钥格式。

将其转换为PEM格式,而非RSA格式。

数值错误:不支持PEM加密格式。

必须解除PEM短语。

AccessTokenRefreshError: 无效的授权

在`service_account_name`中指定的是服务帐号的电子邮件地址,而不是客户端ID。

广告
将在 10 秒后关闭
bannerAds