Autour de l'authentification de PyDrive2, un package pour faire fonctionner Google Drive avec Python

introduction

Dans cet article, nous allons utiliser PyDrive2 (GitHub) parmi les packages qui exploitent Google Drive avec Python. Google Drive peut être exploité via l'API Drive, mais je résumerai la partie authentification de l'API Drive dans `PyDrive2 'sous forme de mémorandum. Plus précisément, il traite de ce qui suit.

--Comment créer des identifiants (ID client OAuth 2.0) dans la console GCP

À propos de PyDrive2

PyDrive (GitHub) est peut-être un peu connu comme un package permettant d'utiliser Google Drive avec Python. Malheureusement, PyDrive n'est plus à jour depuis plus d'un an maintenant.

Il semble que PyDrive2 ait récemment été dérivé de PyDrive (janvier 2020). PyDrive2 prétend être «une fourche maintenue de PyDrive».

Il semble que PyDrive2 n'ait pas encore incorporé de modifications rétrocompatibles (en mai 2020). En tant que document PyDrive2, PyDrive Document est lié. De plus, les connaissances accumulées dans le numéro de PyDrive ont l'impression qu'elles peuvent s'appliquer telles quelles à PyDrive2.

Environnement d'exploitation

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G3020
$ python -V
Python 3.8.1
$ pip list | grep PyDrive2
PyDrive2                 1.4.10

Commencez à utiliser PyDrive2

Suivez le Quickstart de la documentation PyDrive (https://gsuitedevs.github.io/PyDrive/docs/build/html/quickstart.html).

  1. Créez les informations d'identification requises pour utiliser l'API Drive dans la console GCP.
  2. Authentification à l'aide des informations d'authentification créées

Procédez dans l'ordre de.

1. Créez des identifiants à partir de la console GCP

On suppose que vous disposez d'un compte GCP (Google Cloud Platform) et que vous avez un ou plusieurs projets dans GCP. Créez un "ID client OAuth" selon Quickstart.

  1. Si elle n'est pas activée, activez l'API Drive à partir de la console GCP
  1. Créez un ID client OAuth (entrez la valeur du document) --Opération recommandée depuis API et tableau de bord de service --Créer à partir de "Credentials" dans la navigation sur la gauche 1-create_oauth_client_id.png → Entrez la valeur de réglage dans Quickstart 2-fill_out_creation_form.png → Créé (ce pop-up se ferme en cliquant sur "OK") 3-complete_creation.png

  2. Après la création, téléchargez les informations d'authentification sur le terminal de développement 4-download_client_id.png

2. Contrôle de fonctionnement

Reportez-vous à Quickstart et exécutez le code suivant.

quickstart.py


from pydrive2.auth import GoogleAuth  #Lire pydrive comme pydrive2 à partir de Quickstart

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

Placement des fichiers


.
├── client_secrets.json
└── quickstart.py

Lancer quickstart.py lancera le navigateur.

$ python quickstart.py
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?client_id=...
5-login_google.png

Lorsque vous sélectionnez un compte Google et que vous vous connectez, 6-authentication_completed.png

La ligne de commande montre également que l'authentification a réussi!

$ python quickstart.py
Your browser has been opened to visit:

  :

Authentication successful.

Je veux empêcher le navigateur de démarrer à chaque fois

Accédez à la documentation PyDrive OAuth made easy.

Avec seulement deux lignes de code, j'ai été authentifié pour utiliser l'API Drive. C'est assez simple, mais vous devez vous connecter depuis votre navigateur chaque fois que vous exécutez ce script. Cela ne convient pas à l'automatisation par script. Par conséquent, nous allons définir PyDrive2 pour * enregistrer les informations utilisées pour l'authentification et les mettre à jour automatiquement ** par la suite. Après vous être connecté une fois, les informations d'identification enregistrées seront mises à jour et utilisées, éliminant ainsi le besoin de se connecter à partir d'un navigateur.

Pour réaliser ce qui précède, écrivez settings.yaml. Les paramètres d'enregistrement des informations d'authentification dans un fichier sont les suivants.

settings.yaml


# OAuth 2.0 Spécifiez (renommez) les informations d'identification du client
client_config_file: my_client_secrets.json

#Paramètres pour enregistrer les informations d'identification dans un fichier
save_credentials: True
save_credentials_backend: file
save_credentials_file: saved_credentials.json

#Informations d'authentification(credentials)Configuration de la mise à jour automatique (le navigateur ne démarre pas)
get_refresh_token: True

Placement des fichiers


.
├── my_client_secrets.json
├── quickstart.py
└── settings.yaml

L'exécution de python quickstart.py sur la ligne de commande vous oblige à vous connecter à partir de votre navigateur la première fois. 7-login_google-again.png

Une page d'avertissement s'affiche en fonction de la plage d'opérations utilisant l'API Drive (portée * décrite plus loin). "Afficher les détails" pour se déplacer. 8-unverified_page.png

9-allow_access_private_data.png

Si vous l'autorisez, votre navigateur affichera "Le flux d'authentification est terminé".

L'authentification à l'aide d'un navigateur n'est que la première fois. Puisque get_refresh_token est activé [^ 1], le navigateur ne démarre pas car les informations d'authentification sont automatiquement mises à jour et authentifiées à partir de la deuxième fois [^ 2].

Placement des fichiers


.
├── my_client_secrets.json
├── quickstart.py
├── saved_credentials.json  #Créé. Après cela, il sera mis à jour automatiquement
└── settings.yaml

[^ 1]: Chaque fois que je change la valeur de get_refresh_token, il semble que je doive me connecter avec le navigateur pour la première fois. Il est recommandé de supprimer les informations d'identification enregistrées et de les réexécuter (j'ai activé get_refresh_token avec saved_credentials.json dans le passé, mais cela n'a pas été reflété et j'en étais accro. Je me demande si les éléments des données renvoyées sont différents. "

[^ 2]: Il semble que les informations d'authentification ne soient pas mises à jour automatiquement après un certain temps. Lorsque je l'ai touché pour la première fois depuis longtemps, une erreur s'est produite. J'ai supprimé les informations d'identification enregistrées (saved_credentials.json) et ré-exécutées pour les résoudre.

Information supplémentaire

Champ d'application de l'API Drive

Il y a un élément appelé ʻoauth_scope dans settings.yaml[^ 3]. Comme elle n’est pas spécifiée cette fois, la valeur par défaut est «[‘ https://www.googleapis.com/auth/drive ’]». Selon la liste des étendues de l'API Drive (https://developers.google.com/drive/api/v2/about-auth#OAuth2Authorizing), il s'agit d'une étenduerestreinte`. Les applications qui nécessitent une portée restreinte et qui n'ont pas réussi le processus de vérification de Google seront étiquetées comme "Application non vérifiée" et la page précédente "Cette application n'a pas été vérifiée" sera affichée. [^ 4].

Selon https://support.google.com/cloud/answer/7454865, vous devez ajouter «https: // www.googleapis.com / auth / drive» à «l'écran de consentement OAuth». Il y a. Cependant, le simple fait d'ajouter ce n'était pas suffisant et j'ai dû demander la vérification de Google.

Ce que vous voulez réaliser en travaillant avec Google Drive en Python, c'est, à ce stade, l'automatisation personnelle. Étant donné que nous ne développons pas une application pour une utilisation par un tiers, nous ne procéderons pas au processus d'approbation et continuerons à la développer telle quelle [^ 5].

[^ 4]: depuis https://support.google.com/cloud/answer/7454865. "Une application non vérifiée est une application ou un script d'applications qui demande une portée OAuth sensible ou restreinte, mais qui n'a pas subi le processus de vérification de Google"

[^ 5]: "Applications en développement: si votre application est expérimentale ou est une version de test, vous n'avez pas besoin de passer par la vérification, sauf si vous décidez de la lancer au public." Https://support.google.com/ Depuis cloud / answer / 7454865

LocalWebserverAuth et CommandLineAuth

J'ai changé LocalWebserverAuth en CommandLineAuth pour empêcher le navigateur de se lancer lors de ma première connexion, mais cela n'a pas fonctionné.

À partir de "l'erreur d'approbation" affichée sur le navigateur, l'ID client OAuth est * créé en tant qu'application Web *, il semble donc qu'il ne prend pas en charge CommandLineAuth.

could_not_use_commandlineauth.png

Par conséquent, je pense qu'il est essentiel de se connecter avec le navigateur pour la première fois [^ 6].

[^ 6]: Dans l'environnement d'exécution où le navigateur ne peut pas être démarré, les informations d'identification enregistrées sont dupliquées et placées (le navigateur ne démarre pas, il peut donc être exécuté sans problème).

settings.yaml et client_secrets.json

Si settings.yaml et client_secrets.json se trouvent dans le même répertoire que quickstart.py, settings.yaml semble être chargé. J'étais curieux, alors j'ai jeté un coup d'œil à l '[Implémentation] de Google Auth dans ʻauth.py` (https://github.com/iterative/PyDrive2/blob/d2065b42a4c6cc39fb6666a278b361d2c59ab8c2/pydrive2/auth.py#L142). ..

Dans cet article

--client_secrets.json est utilisé avant de créer settings.yaml --Après avoir créé settings.yaml, le client_config_file spécifié ici sera utilisé.

Il y a.

Recommended Posts

Autour de l'authentification de PyDrive2, un package pour faire fonctionner Google Drive avec Python
L'histoire de la création d'un module qui ignore le courrier avec python
[Python] Un programme qui compte le nombre de vallées
Faire une copie d'un fichier Google Drive à partir de Python
Un mémo que j'ai touché au magasin de données avec python
[Python] Un programme qui compare les positions des kangourous.
Accédez à Google Drive avec Python
Dupliquer le modèle de document préparé dans Google Drive avec PyDrive2
Script Python qui compare le contenu de deux répertoires
Un enregistrement de patcher un package python
Mémorandum de l'outil de gestion de paquets Python ez_setup
[Python] Créez un graphique qui peut être déplacé avec Plotly
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
L'histoire de la création d'un pilote standard pour db avec python.
Une fonction qui mesure le temps de traitement d'une méthode en python
L'idée d'alimenter le fichier de configuration avec un fichier python au lieu de yaml
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
Créez un programme de jugement de compatibilité avec le module aléatoire de python.
[Python] Un programme qui trouve le nombre maximum de jouets pouvant être achetés avec votre argent
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python
[Python] Un programme qui crée des escaliers avec #
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
[Python] Un programme qui calcule le nombre de segments de chocolat qui remplissent les conditions
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
[Explication AtCoder] Contrôlez les problèmes A, B, C d'ABC182 avec Python!
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Comment exécuter le code pratique du livre "Making Profitable AI with Python" sur Google Colaboratory
[Python] Un programme qui calcule le nombre de chaussettes jumelées
Vérifier l'existence du fichier avec python
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
Rechercher le labyrinthe avec l'algorithme python A *
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
Calculez la probabilité d'être une pièce de calmar avec le théorème de Bayes [python]
Hit une méthode d'une instance de classe avec l'API Web Python Bottle
[python] [meta] Le type de python est-il un type?
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Un monde typé qui commence par Python
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
L'histoire du traitement A du blackjack (python)
D'un livre qui apprend de manière intéressante la façon de penser du programmeur (Python)
[Python] Un programme qui arrondit le score
Télécharger des images sur Google Drive avec Python
[Explication AtCoder] Contrôle ABC184 Problèmes A, B, C avec Python!
[Python] Note: Fonction auto-conçue pour trouver la zone de distribution normale
Article qui peut être une ressource humaine qui comprend et maîtrise le mécanisme de l'API (avec du code Python)
À propos du problème que la version python de Google App Engine ne maille pas
[Explication AtCoder] Contrôlez les problèmes A, B, C, D d'ABC183 avec Python!
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
Informer périodiquement l'état de traitement de Raspberry Pi avec python → Google Spreadsheet → LINE