[PYTHON] Utilisez la clé P12 du compte de service avec dev_appserver de GAE SDK

Par exemple, lorsque vous créez une couche d'API par Cloud Endpoints avant BigQuery, vous souhaitez vous connecter à BigQuery à partir de dev_appserver du SDK GAE.

Lorsque vous créez un compte de service dans la Developers Console, la clé P12 est téléchargée. La clé P12 est une clé privée au format PKCS12.

Le PyCrypto utilisé par ʻoauth2client` ne prend pas en charge le format PKCS12. Si vous essayez de l'utiliser tel quel

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 se produira, vous pouvez donc convertir la clé privée en fonction du message.

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

Le mot de passe de la clé privée du compte de service est «notasecret».

Exemple de code

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

import os

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

# OAuth2.Liste 0 PORTÉES.
#Exemple) https://cloud.google.com/bigquery/authentication#oauthbasics
BigQuery_SCOPE = ('https://www.googleapis.com/auth/bigquery',)

def get_bigquery_client():
  # dev_Déterminez s'il s'exécute sur le serveur d'applications. Variable d'environnement`SERVER_SOFTWARE`Mais`Dev`commencer à partir de.
  if os.environ.get('SERVER_SOFTWARE', 'Dev').startswith('Dev'):
    #Ouvrez le fichier PEM en lecture seule.
    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 = '[email protected]',
        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)
  #Client HTTP avec Memcache défini pour l'utilisation du cache.
  http = credentials.authorize(httplib2.Http(memcache))
  #Spécifiez Google Cloud Endpoints et renvoyez le client API.
  return apiclient.discovery.build('bigquery', 'v2', http=http)

Erreurs courantes

IOError: [Errno 13] file not accessible: 'privatekey.pem'

Étant donné que vous ne pouvez accéder qu'aux fichiers du projet GAE, déplacez la clé privée vers le répertoire sous le projet GAE.

ValueError: RSA key format is not supported

Convertissez au format PEM au lieu du format RSA.

ValueError: PEM encryption format not supported.

La phrase PEM doit être supprimée.

AccessTokenRefreshError: invalid_grant

L'adresse e-mail du compte de service est spécifiée dans service_account_name. Pas un ID client.

Recommended Posts

Utilisez la clé P12 du compte de service avec dev_appserver de GAE SDK
[Hyperledger Iroha] Remarques sur l'utilisation du SDK Python
Définir la clé de compte de service Google Cloud dans heroku
Commandes souvent utilisées dans GAE / P
Sakura utilisant Python sur Internet
Utilisez le désassembleur métabolique sur Google Colaboratory
Utiliser le capteur Grove avec Raspberry Pi
[2015/11/19] Comment enregistrer un service localement à l'aide du SDK python avec naoqi os