使用远程 API 访问应用引擎环境时获得 401 未授权



我在从本地机器使用远程 api 访问某些 appengine 项目时遇到问题。它失败并显示 401 -urllib2.HTTPError: HTTP Error 401: Unauthorized Too many auth attempts

我正在使用以下命令启动远程 api 外壳:python /usr/lib/google-cloud-sdk/platform/google_appengine/remote_api_shell.py -s <version>-dot-<my appengine project>.appspot.com

我使用的是 gcloud 版本 200.0.0。我的凭据已保存到~/.config/gcloud/application_default_credentials.json运行gcloud auth application-default login并完成 Web 身份验证流后。 我已经确认相同的代码已部署到我们所有的应用程序引擎环境中 以下内容也在 app.yaml 中设置

builtins:
- remote_api: on

根据 https://cloud.google.com/appengine/docs/standard/python/tools/remoteapi

我们有很多应用引擎项目。此命令适用于所有命令,但始终失败其中 2 个。根据IAM和管理页面,我的电子邮件被列为其失败的两个环境之一的所有者(我认为它至少应该在该环境中工作,但事实并非如此(。我还需要执行哪些其他操作才能远程访问环境?或者最近有没有人经历过这种情况。

在下面附加全栈跟踪

Traceback (most recent call last):
File "/usr/lib/google-cloud-sdk/platform/google_appengine/remote_api_shell.py", line 133, in <module>
run_file(__file__, globals())
File "/usr/lib/google-cloud-sdk/platform/google_appengine/remote_api_shell.py", line 129, in run_file
execfile(_PATHS.script_file(script_name), globals_)
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/remote_api_shell.py", line 160, in <module>
main(sys.argv)
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/remote_api_shell.py", line 156, in main
oauth2=True)
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/remote_api_shell.py", line 74, in remote_api_s
hell
secure=secure, app_id=appid)
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 1052, in Co
nfigureRemoteApiForOAuth
rpc_server_factory=rpc_server_factory)
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 1137, in Co
nfigureRemoteApi
app_id = GetRemoteAppIdFromServer(server, path, rtok)
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py", line 842, in Get
RemoteAppIdFromServer
response = server.Send(path, payload=None, **urlargs)
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 259, in Send
NeedAuth()
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 235, in NeedA
uth
RaiseHttpError(url, response_info, response, 'Too many auth attempts.')
File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/appengine_rpc_httplib2.py", line 85, in RaiseH
ttpError
raise urllib2.HTTPError(url, response_info.status, msg, response_info, stream)
urllib2.HTTPError: HTTP Error 401: Unauthorized Too many auth attempts.

我注册了Google Cloud付费支持以解决此问题。 花了一点时间,但解决方案是像这样添加--secure标志:

python remote_api_shell.py --secure app-name

我不知道幕后发生了什么变化,所以现在需要这个额外的标志。 我最近没有对我的网站或项目进行任何可能导致此问题的更改。

同样令人不安的是,remote_api_shell.py的默认模式不安全,但至少有一个解决方案。

以下是我不再需要的原始答案。


我能够让它工作,但这是一种黑客攻击,我想以正确的方式修复它。

这是黑客:

  • 在云控制台上创建新的服务帐户并使其成为项目所有者
  • 将密钥下载为 JSON 文件
  • export GOOGLE_APPLICATION_CREDENTIALS=[PATH TO JSON FILE]

现在remote_api_shell.py工作了。

看起来以前的一个服务帐户已损坏,但我不知道如何损坏。

remote_api_shell.py使用存储在此处的 API 凭据:

~/.config/gcloud/application_default_credentials.json

您可以重命名该文件并运行命令'gcloud auth login'以重新初始化登录凭据。这适用于几种类似的情况。

编辑:

使用以下命令强制作用域也可能是值得的:

gcloud auth application-default login --scopes='https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email'

您可以在此处找到有关范围的详细信息。它们应该默认设置,但可能值得试一试。

我不是这方面的专家,但应用程序默认凭据似乎链接到用户帐户,而不是应用程序的服务帐户。 (我假设这是因为我可以使用从gcloud auth application-default login获得的单个凭据使用remote_api_shell.py连接到我的两个应用程序(。

您是否正在使用的用户帐户未列为无法正常工作的应用程序的所有者或编辑者? 在 gaefan 的情况下,他们可以创建新的服务帐户并使其成为所有者这一事实表明并非如此,但值得检查您是否遇到这种情况:

  • 您 console.cloud.google.com 在一个浏览器中以 your.name@gmail.com 身份登录。

  • 您已登录到 console.cloud.google.com your.name@company.com 在另一个浏览器中,并可以访问那里的应用程序。

  • gcloud auth application-default login第一个浏览器中弹出登录/授权流,并在您确实需要 your.name@company.com 时为 your.name@gmail.com 生成应用程序默认凭据。

最新更新