web-dev-qa-db-fra.com

ValueError: Les secrets des clients doivent être pour une application Web ou installée

Je suis en train d'exécuter le code d'exemple QuickStart.py Sous Python QuickStart et je reçois l'erreur suivante:

ValueError: Les secrets des clients doivent être pour une application Web ou installée.

J'ai créé un credentials.json Dossier avec les droits du propriétaire du projet.

L'erreur se produit dans la pièce de code suivante:

if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
        creds = flow.run_local_server()
    # Save the credentials for the next run
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

Je remarque également que le fichier Token.Pickle n'est pas créé. Ceci est la sortie d'erreur:

  File "updateSlidev01.py", line 51, in <module>
    main()
  File "updateSlidev01.py", line 31, in main
    flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
  File "/Library/Python/2.7/site-packages/google_auth_oauthlib/flow.py", line 174, in from_client_secrets_file
    return cls.from_client_config(client_config, scopes=scopes, **kwargs)
  File "/Library/Python/2.7/site-packages/google_auth_oauthlib/flow.py", line 147, in from_client_config
    'Client secrets must be for a web or installed app.')
ValueError: Client secrets must be for a web or installed app.
18
PaoloAgVa

Pour que quiconque vienne ici parce qu'ils souhaitent se connecter à l'API du calendrier GCP via un compte de service et non cet ID client OAUTH2, créez l'objet creds dans l'exemple original comme suit:

from google.oauth2 import service_account

SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

En supposant que le compte de service est configuré avec l'accès correct, cela accédera au calendrier sans demander à l'utilisateur de confirmation.

2
Adam Hughes