Vous pouvez sauter l'introduction car ce que vous voulez faire est comme le titre l'indique.
J'écrivais une application pour jouer avec Google Agenda à l'aide de la bibliothèque cliente des API Google. Supprimez les informations du client OAuth2 de Google Cloud Platform en tant que client_secret.json
et spécifiez le ** nom de fichier ** dans l'argument de ʻoauth2client.client.flow_from_clientsecrets ()`.
Le problème ici. Je ne veux pas ajouter client_secret.json
au contrôle de version git en raison de problèmes de sécurité. Cependant, j'exécute l'application sur Heroku, je ne peux donc pas télécharger de fichiers. (Il semble que vous devriez utiliser le stockage d'objets comme Amazon S3, mais j'ai arrêté parce que c'est ennuyeux parce que je ne l'ai jamais utilisé)
J'ai donc dû spécifier client_secret.json
, mais j'avais du mal à mettre ce fichier sur le serveur Heroku.
Donc, je veux mettre les données du dictionnaire au lieu de file name
dans la fonction ʻoauth2client.client.flow_from_clientsecrets (). Ensuite, stockez le contenu de
client_secret.json` dans les variables d'environnement de Heroku et placez-les dans les données du dictionnaire.
(Est-ce vraiment mal de mettre des informations confidentielles dans des variables d'environnement?)
Après avoir écrit le code, j'ai réalisé que j'aurais dû créer une instance de ʻOAuth2WebServerFlow` normalement. Par conséquent, je n'ai pas à le remplacer séparément, mais j'ai appris que cela peut être fait de cette manière, alors je vais le laisser.
ʻOauth2client.client.flow_from_clientsecrets () `Je veux que la fonction contienne ** type de dictionnaire ** au lieu de ** nom de fichier **.
Le code source de la bibliothèque ressemblait à ceci. (Ce qui suit est un extrait du code de licence Apache de Google Inc.)
Partiellement omis de ʻoauth2client.client.py`.
@_helpers.positional(2)
def flow_from_clientsecrets(filename, scope, redirect_uri=None,
message=None, cache=None, login_hint=None,
device_uri=None, pkce=None, code_verifier=None):
try:
client_type, client_info = clientsecrets.loadfile(filename,
cache=cache)
if client_type in (clientsecrets.TYPE_WEB,
-----Ce qui suit est omis------
Notez que filename
est passé à clientsecrets.loadfile ()
.
J'ai aussi regardé clientsecrets.loadfile ()
.
def loadfile(filename, cache=None):
_SECRET_NAMESPACE = 'oauth2client:secrets#ns'
if not cache:
return _loadfile(filename)
obj = cache.get(filename, namespace=_SECRET_NAMESPACE)
-----Ce qui suit est omis------
Si cache
n'existe pas, le traitement est transféré à la fonction _loadfile
. Jetons un œil à _loadfile
.
def _loadfile(filename):
try:
with open(filename, 'r') as fp:
obj = json.load(fp)
except IOError as exc:
raise InvalidClientSecretsError('Error opening file', exc.filename,
exc.strerror, exc.errno)
return _validate_clientsecrets(obj)
Je suis arrivé à la fonction qui charge le fichier. Si vous remplacez cette fonction, vous pouvez mettre un type de dictionnaire dans l'argument filename
.
Alors après ça mon code
# `client.flow_from_clientsecrets`Les fonctions peuvent prendre le type de dictionnaire comme arguments
# `clientsecrets._loadfile`Fonction de remplacement
def new_loadfile(data):
return clientsecrets._validate_clientsecrets(data)
clientsecrets._loadfile = new_loadfile
Après ça
flow = client.flow_from_clientsecrets(
Sorte de dictionnaire,
scope='https://www.googleapis.com/auth/calendar',
redirect_uri=flask.url_for('oauth2callback', _external=True))
Vous pouvez maintenant utiliser flow_from_clientsecrets
qui prend un type de dictionnaire comme argument.
def new_func(args):
#Traitement divers
return hoge
hoge_library.func = new_func
De cette façon, vous pouvez facilement le remplacer et cela affectera toutes les fonctions qui l'utilisent.
Remplacer les fonctions de la bibliothèque, je l'ai fait pour la première fois, mais cela fonctionne si facilement. J'ai peur.
Recommended Posts