我正在 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或已安装的应用程序的。
答案 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。