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

Posted

技术标签:

【中文标题】ValueError:客户端机密必须用于 Web 或已安装的应用程序【英文标题】:ValueError: Client secrets must be for a web or installed app 【发布时间】:2019-10-20 01:33:39 【问题描述】:

我在 Python Quickstart 下运行 quickstart.py 示例代码,我收到以下错误:

ValueError:客户端密码必须用于 Web 或已安装的应用程序。

我创建了一个具有项目所有者权限的 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.

【问题讨论】:

您是如何创建该 credentials.json 文件的? 嗨!这正是问题所在。我回答了下面的问题。非常感谢! 【参考方案1】:

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

【讨论】:

如果 json 是作为服务帐户创建的,您可以使用什么来代替? 在这里找到解决方案developers.google.com/identity/protocols/… @Kajsa 谢谢你,当有人回来回答他们的问题时,总是很感激。 您好-请问这是否意味着普通服务帐户不能用于此类应用程序?【参考方案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)

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

【讨论】:

上帝保佑你? 如果我们尝试连接到 GCP 日历 API,为什么要使用“sqlservice.admin”范围?我认为您的意思是“calendar.readonly”。如果我是对的,请更正。 可能 - 我认为这只是我当时碰巧使用的范围。但是,是的,显然为手头的任务使用适当的范围。

以上是关于ValueError:客户端机密必须用于 Web 或已安装的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

SharePoint Online - 内容编辑器 Web 部件 - 机密管理

Google Oauth 错误:应设置至少一个客户端机密(已安装或 Web)

Azure AD,客户端机密应用程序调用具有自定义应用程序 ID URI 的 web api,返回 401

Azure AD B2C:客户在兑换机密授权时必须发送 client_secret

ValueError:x 和 y 必须具有相同的第一维,但具有形状 (6,) 和 (8,) [重复]

如何自动创建客户端机密 json 文件