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

时间:2019-06-04 13:46:08

标签: python google-api google-api-python-client google-slides-api

我正在 Python Quickstart下运行quickstart.py示例代码,并且出现以下错误:

  

ValueError:客户机密必须是针对Web或已安装的应用程序的。

我创建了具有项目所有者权限的certificate.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文件。这是错误输出:

  

文件“ updateSlidev01.py”,第51行,在       主要()     主文件中的文件“ updateSlidev01.py”,第31行       流= InstalledAppFlow.from_client_secrets_file('credentials.json',SCOPES)     在from_client_secrets_file中的文件“ /Library/Python/2.7/site-packages/google_auth_oauthlib/flow.py”第174行       返回cls.from_client_config(client_config,scopes = scopes,** kwargs)     文件“ /Library/Python/2.7/site-packages/google_auth_oauthlib/flow.py”,第147行,位于from_client_config中       “客户端机密必须是网络或已安装的应用程序的机密。”)   ValueError:客户机密必须是针对Web或已安装的应用程序的。

2 个答案:

答案 0 :(得分:2)

对于任何想通过服务帐户而非此Oauth2客户端ID实际连接到GCP日历API的人来这里,请在原始示例中创建creds对象,如下所示:

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)

假设服务帐户配置了正确的访问权限,则可以访问日历而不会提示用户进行确认。

答案 1 :(得分:0)

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