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 不兼容的 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()
调用(或等效项)对您需要的每个服务进行身份验证:
Run Code Online (Sandbox Code Playgroud)# If you don't specify credentials when constructing the client, the # client library will look for credentials in the environment. storage_client = storage.Client()
如果您要使用的服务帐户不是应用程序的默认服务帐户,则需要指定它:
您可以通过执行以下任一操作来覆盖此默认流程:
设置
GOOGLE_APPLICATION_CREDENTIALS
环境变量。如果设置了此变量,云服务将使用该变量指定的凭据而不是默认服务帐户。在实例化
Client
云服务的对象时指定凭据。例如,如果您的应用程序正在调用不同项目中的云服务,您可能需要手动传递凭据。
归档时间: |
|
查看次数: |
1402 次 |
最近记录: |