API GCP-App Engine недоступны, с py 3 - PullRequest
2 голосов
/ 21 сентября 2019

Я пытаюсь использовать API Admin SDK из App Engine, используя служебную учетную запись с делегированием по всему домену, что позволяет ему выдавать себя за администратора.

Я нашел несколько руководств для этого, но никто не работает, как я ожидаю,

Приведенный ниже код внедрен в стандарт App Engine.

main.py

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)

app.yaml

runtime: python37

Код 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." 

Как вы можете видеть отчет об ошибке The App Engine APIs are not available, но нет API с таким именем впроект GCP.

Ниже всех API, которые я включаю в проект, пытаясь достичь того, о чем он просит.Конечно, ошибка все еще появляется.

GCP Project Enabled APIs

Это тестовая среда, если кому-то нужен доступ, просто спросите, я с удовольствием предоставлю вам разрешение зрителя на проект GCP

Спасибо, что уделили время:)

1 Ответ

4 голосов
/ 21 сентября 2019

Вы используете среду выполнения python37 (стандартная среда 2-го поколения), которая не совместима с API механизма приложений (только для python27 / 1-го поколения).От Понимание различий между средами Python 2 и Python 3 :

Собственные API App Engine недоступны в Python 3. В этом разделе перечислены рекомендуемые замены.

from google.auth import app_engine на самом деле не будет использоваться, поскольку он основан на API Identity App , одном из тех проприетарных.

Для проверки подлинности во время выполнения python37 выполните Предоставление вашему приложению доступа к облачным службам .В основном, в отличие от API Identity App, в котором вы вызываете Credentials() один раз, а затем используете идентификатор приложения для доступа к сервисам, в python37 вы аутентифицируетесь для каждой необходимой вам службы, используя соответствующий сервисный API Client() вызов (или эквивалентный):

# 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 для облачной службы.Например, если ваше приложение вызывает облачную службу в другом проекте, вам может потребоваться передать учетные данные вручную .

...