Идентификация учетной записи службы из AppEngine в облачную функцию - PullRequest
1 голос
/ 17 октября 2019

У меня есть частная HTTP-функция Google Cloud, которую я хотел бы вызвать из приложения AppEngine в другом проекте.

В идеале, служебная учетная запись AppEngine должна иметь roles/cloudfunctions.invoker в моей облачной функции, я бы отключил все другие инициаторы, и мне вообще не пришлось бы беспокоиться об аутентификации внутри CF. Я изо всех сил пытаюсь передать идентификацию AppEngine.

Документы Google показывают, как сделать это из одной облачной функции в другую, но вместо этого AppEngine использует свою собственную библиотеку идентификации для упрощения получения токенов доступа. Схема документов AppEngine:

Любой способ включить идентификацию AppEngine, чтобы нативная роль Google Cloud Cloud Function invoker выполняла запрос?

1 Ответ

0 голосов
/ 18 октября 2019

В этой ситуации вам нужно будет выполнить программную аутентификацию самостоятельно.

Сначала вам нужно добавить учетную запись службы механизма приложений в разрешение Cloud Functions.

После этого вам нужновыполнить шаги для этой ситуации . По сути, вам нужно будет создать JWT, авторизовать его и затем включить JWT в ваш запрос. Здесь вы можете найти пример кода для создания и авторизации JWT.

Я воспроизвел вашу ситуацию на python. Я использовал код из ссылки, которую я отправил вам, а затем, после того, как у меня все в порядке с JWT, я сделал такой запрос:

@app.route('/')
def index():
  data = {'headers':      request.headers,
        'service_name': os.environ.get('GAE_SERVICE', '(running locally)'),
        'environment':  os.environ}
  return render_template('index.html', data=data)

@app.route('/request')
  def send_request():
     import requests
     receiving_function_url = 'YOUR-CLOUD-FUNCT-URL'
     r=requests.get("http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?audience="+receiving_function_url,
                headers={'Metadata-Flavor': 'Google'})

     response = make_iap_request('YOUR-CLOUD-FUNCTION-URL', 'YOUR-CLOUD-FUNCTION-URL')

     print(response)

     return response




if __name__ == '__main__':
app.run('127.0.0.1', port=8080, debug=True)

Зависимости, которые вам нужны, в needs.txt:

flask
PyJWT==1.7.1
cryptography==2.7
google-auth==1.6.3
gunicorn==19.9.0
requests==2.22.0
requests_toolbelt==0.9.1

В этом репозитории вы можете найти больше примеров кода о том, как выполнять запросы IAP (Identity Aware Proxy).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...