ValueError:客户端密钥必须用于网络或已安装的应用程序

问题描述 投票:0回答:3

我正在运行下的quickstart.py示例代码 Python 快速入门,我收到以下错误:

ValueError:客户端密钥必须适用于网络或已安装的应用程序。

我创建了一个具有项目所有者权限的

credentials.json
文件。

错误发生在以下代码中:

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)

我还注意到 token.pickle 文件没有被创建。这是错误输出:

  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.
python google-api google-api-python-client
3个回答
58
投票

对于任何来到这里的人,因为他们希望通过服务帐户而不是此 Oauth2 客户端 ID 实际连接到 GCP 日历 API,请在原始示例中创建

creds
对象,如下所示:

from google.oauth2 import service_account

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

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

假设服务帐户配置了正确的访问权限,这将访问日历而不提示用户确认。


47
投票

问题是我使用的是在服务帐户密钥管理服务帐户下生成的 json,而不是 OAuth 2.0 客户端 ID 下生成的 json。

按照本讲师创建 oauth 客户端 ID。 https://developers.google.com/workspace/guides/create-credentials#oauth-client-id


1
投票

就我而言,

credentials.json
文件的键名称错误。

文件看起来像这样:

{"SCc":{"client_id":"****","project_id":"****","wnc":"****","dVc":"****","vnc":"****","p2a":"****","kNc":["http://localhost"]}}

我把它改为:

{"installed":{"client_id":"****","project_id":"****","auth_uri":"****","token_uri":"****","auth_provider_x509_cert_url":"****","client_secret":"****","redirect_uris":["http://localhost"]}}

并且工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.