使用远程api访问appengine环境时获取401 Unauthorized

时间:2018-05-15 18:37:54

标签: google-app-engine google-app-engine-python

我在使用本地计算机上的远程api访问某些appengine项目时遇到了一些问题。它失败了401 - urllib2.HTTPError: HTTP Error 401: Unauthorized Too many auth attempts

我使用以下命令启动远程api shell: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并完成Web身份验证流程后,我的凭据已保存到gcloud auth application-default login。我已经确认将相同的代码部署到我们所有的appengine环境中 以下内容也在app.yaml中设置

builtins:
- remote_api: on

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

我们有很多引擎项目。此命令适用于所有这些命令,但在其中2个命令上始终失败。根据IAM&amp;管理页面,我的电子邮件被列为其失败的两个环境之一的所有者(我认为它至少应该在该环境上工作,但事实并非如此)。还有什么我需要做的远程访问环境吗?或者是否有其他人最近经历过此事。

下附加完整堆栈跟踪
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.

3 个答案:

答案 0 :(得分:3)

我注册了Google Cloud付费支持以获取针对此问题的修复程序。花了一些时间,但是解决方案是添加--secure标志,如下所示:

python remote_api_shell.py --secure app-name

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

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

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


我能够使它正常工作,但这是一种破解,我想以正确的方式对其进行修复。

这是黑客:

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

现在remote_api_shell.py有效。

似乎以前的服务帐户之一已损坏,但我不知道如何。

答案 1 :(得分:1)

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'

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

答案 2 :(得分:0)

我不是专家,但是“应用程序默认凭据”似乎链接到用户帐户,而不是应用程序的服务帐户。 (我之所以这样认为,是因为我可以使用remote_api_shell.py并通过从gcloud auth application-default login获得的单个证书来连接到我的两个应用程序。)

您使用的用户帐户是否有可能没有在不起作用的应用程序中列为所有者或编辑者?在gaefan的情况下,他们可以创建新的服务帐户并使其成为所有者的事实并不能说明这一点,但是值得检查的是您没有遇到这种情况:

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

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

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