【问题标题】:Gcloud error 401: REquest had invalid authentication credentialsGcloud 错误 401:请求具有无效的身份验证凭据
【发布时间】:2020-12-24 21:17:23
【问题描述】:

我正在处理一个需要访问 Gcloud 服务帐户的项目。但是,我一直遇到身份验证问题。这是我的命令提示符下的以下错误:

我的命令:

curl -s -H "Content-Type: application/json" \ 
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \ 
https://speech.googleapis.com/v1/speech:recognize \ 
-d @sync-request.json 

输出:

{
  "error": {
    "code": 401,
    "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED"
  }
}

目前,我做了以下事情:我设置了我的环境变量“GOOGLE_APPLICATION_CREDENTIALS”来保存我的服务帐户的 JSON 密钥文件的路径,我在密钥文件所在的目录中打开了我的 cmd,我运行了命令。我还有什么遗漏的吗?

我关注的文档来自https://cloud.google.com/docs/authentication/production#windows

【问题讨论】:

  • 我不想看到您的授权令牌,但是当您检查它时,它看起来对吗?我知道您必须设置标头,但承载部分似乎您应该是身份验证机制本身的一部分。当它谈到 auth application-defautl 时,它说“这些凭据仅由 Google 客户端库在您自己的应用程序中使用。”这对我来说并不乐观。从未使用过 glocud,所以我可能完全错了。
  • 您可以尝试创建new service account 并下载JSON key file 以获得新的凭据,并尝试按照说明在Windows 中设置路径。

标签: gcloud speech-to-text google-speech-to-text-api


【解决方案1】:

几件事。

gcloud 不使用 ADC;设置GOOGLE_APPLICATION_CREDENTIALS 不配置gcloud

您应该(尚未尝试)能够使用gcloud auth activate-service-account ...,然后使用gcloud auth print-access-token

或者您可以只使用普通(人工|非服务)帐户和gcloud auth print-access-token

或者,您可以使用gcloud auth application-default login,然后使用gcloud auth application-default print-access-token,但两者同时使用。

不要在标头中引用标记:

TOKEN="$(gcloud auth print-access-token)"                     # Either
TOKEN="$(gcloud auth application-default print-access-token)" # Or

curl \
--silent \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${TOKEN}" \
--data @sync-request.json \
https://speech.googleapis.com/v1/speech:recognize

【讨论】:

  • 对不起,我应该更具体一些。我正在尝试通过命令提示符将我的应用程序作为服务帐户进行身份验证。根据文档,我可以使用 Google Cloud Client Libraries 和 ADC 自动查找我的服务帐户凭据。这是我所指的文档:cloud.google.com/docs/authentication/production#windows.
  • 您只能将GOOGLE_APPLICATION_CREDENTIALS 与 Google 的 SDK 一起使用。正如我所展示的,您可以将 print-access-tokem 值与 curl 一起使用。但是print-access-token 只能使用gcloud auth 的凭据。普通的 Google(人工)帐户或服务帐户。对于后者,您必须gcloud auth activate-service-account。你甚至可以gcloud auth application-default print-access-token,但你必须先gcloud auth application-default login。不再推荐最后一种方法,并且以这种方式使用它有点不寻常。
  • ...这是因为,这是|通过模拟人工凭据来避免使用服务帐户的一种方法。如果您只有使用 Google SDK 的代码,请创建一个服务帐户并使用 GOOGLE_APPLICATION_CREDENTIALS
  • 另外,如果您不知道,请查看oauth2l。这对于处理令牌很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2020-11-09
  • 1970-01-01
  • 2019-04-06
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多