GCP-App Engine API 不可用,py 3

Ryu*_*yuk 2 google-app-engine python-3.x google-admin-sdk google-cloud-platform

我正在尝试使用具有域范围委托的服务帐户从 App Engine 使用 Admin SDK API,允许它模拟管理员。

我找到了几个指南来这样做,但没有一个像我期望的那样工作。

以下代码部署到 App Engine 标准版中。

主文件

from flask import Flask
from google.auth import app_engine
import google.auth


try:
    import googleclouddebugger
    googleclouddebugger.enable()
except ImportError:
    pass

SCOPES = ['https://www.googleapis.com/auth/admin.directory.user']

app = Flask(__name__)

@app.route('/')
def hello():
    credentials, project = google.auth.default()

    appIdentity = app_engine.app_identity

    credentials = app_engine.Credentials(scopes=SCOPES)

    ret = "Expired:{}".format(credentials.expired)
    ret += "\nvalid:{}".format(credentials.valid)
    return 'Hello World!\n'+ret


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080, debug=True)
Run Code Online (Sandbox Code Playgroud)

应用程序.yaml

runtime: python37
Run Code Online (Sandbox Code Playgroud)

该代码credentials = app_engine.Credentials(scopes=SCOPES)将导致应用程序出现 500 错误消息,因为app_engine.app_identity它始终是none

"Traceback (most recent call last):
  File "/env/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/env/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/env/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/env/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/env/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/env/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/srv/main.py", line 52, in hello
    credentials = app_engine.Credentials(scopes=SCOPES)
  File "/env/lib/python3.7/site-packages/google/auth/app_engine.py", line 107, in __init__
    'The App Engine APIs are not available.')
OSError: The App Engine APIs are not available." 
Run Code Online (Sandbox Code Playgroud)

正如您所看到的错误报告,The App Engine APIs are not available但 GCP 项目中没有同名的 API。

下面是我在项目中启用的所有 API,试图实现它的要求。当然,错误还是会出现。

支持 GCP 项目的 API

这是一个测试环境,如果有人需要访问就问,我很乐意为您提供 GCP 项目的查看权限

感谢您的时间 :)

Dan*_*scu 8

您正在使用与应用引擎 API 不兼容的 python37 运行时(第二代标准环境)(只有 python27/第一代)。从了解 Python 2 和 Python 3 环境之间的差异

专有 App Engine API 在 Python 3 中不可用。本节列出了推荐的替代品。

from google.auth import app_engine因为他们是基础上,实际上不会使用应用的身份API,这些专利的一个。

对于 python37 运行时中的身份验证,请遵循授予您的应用程序访问云服务的权限部分。基本上与您调用Credentials()一次然后使用应用程序身份访问服务的 App Identity API 不同,在 python37 中,您可以使用相应的服务 APIClient()调用(或等效项)对您需要的每个服务进行身份验证:

# If you don't specify credentials when constructing the client, the
# client library will look for credentials in the environment.
storage_client = storage.Client()
Run Code Online (Sandbox Code Playgroud)

如果您要使用的服务帐户不是应用程序的默认服务帐户,则需要指定它:

您可以通过执行以下任一操作来覆盖此默认流程:

  • 设置GOOGLE_APPLICATION_CREDENTIALS环境变量。如果设置了此变量,云服务将使用该变量指定的凭据而不是默认服务帐户。

  • 在实例化Client云服务的对象时指定凭据。例如,如果您的应用程序正在调用不同项目中的云服务,您可能需要手动传递凭据