Как безопасно хранить файл учетных данных Google Analytics GA4.json в Функциях Azure?

Я создаю функцию Azure на Python, используя клиентскую библиотеку google-analytics-data для ежемесячной загрузки данных Google Analytics. Инструкции на https://developers.google.com/analytics/devguides/reporting/data/v1/quickstart-client-libraries требуют, чтобы учетные данные API существовали локально в файле с именем учетные данные.json. Когда я разверну это в Функциях Azure, будет ли это существовать в виде обычного текста? Есть ли способ его зашифровать?

Похоже, я должен иметь возможность передавать параметры в BetaAnalyticsDataClient() вместо использования файла, но https://googleapis.dev/python/analyticsdata/latest/data_v1beta/beta_analytics_data.html похоже, что ему нужен токен из Рукопожатие OAuth, а не учетные данные в учетных данных.json.

Что я нашел до сих пор в своем исследовании:

Не обязательно использовать клиентскую библиотеку google-analytics-data, просто кажется, что это будет намного проще. Как лучше всего безопасно пройти аутентификацию с помощью API GA4 из Функций Azure?

Вы можете добавить учетные данные Google API в свой файл local.settings.json в своей функции. Файл local.settings.json будет частью git ignore, поэтому он не будет контролироваться версией вашего кода.

SiddheshDesai 18.04.2023 08:19

Только что развернул мой код в Функциях Azure и убедился, что файл учетных данных развернут в виде обычного текста вместе с фактическим кодом. Кто-нибудь подключался к API GA4 из Azure более безопасным способом?

Jeet 21.04.2023 05:18

Извините @SiddheshDesai, я пропустил ваш предыдущий комментарий. Если я помещу учетные данные в local.settings.json, как мне получить токен для BetaAnalyticsDataClient()? По умолчанию BetaAnalyticsDataClient ищет локально установленный файл. Похоже, я должен сделать что-то вроде BetaAnalyticsDataClient(private_key=os.getenv('private_key')‌​), но это выдает ошибку.

Jeet 21.04.2023 05:25

Вы пытались использовать os.environ["<ваша настройка с секретами>"] или os.getenv("<ваша настройка с секретом>") в коде своей функции, чтобы получить секрет из local.settings.json? Пример def main(req: func.HttpRequest) -> func.HttpResponse: logging.info('Триггерная функция HTTP Python обработала запрос.') connectionstring = os.environ["connectionstring"] conn = pyodbc.connect(connectionstring) курсор = conn.cursor(), где у меня есть строка подключения, сохраненная в моем local.settings.json как "connectionstring": "<string>"

SiddheshDesai 27.04.2023 11:33

Это для локального использования. Вы также можете сохранить свои секреты или учетные данные в хранилище ключей Azure и импортировать эти секреты в свой код функции, см. здесь - stackoverflow.com/questions/65606790/…

SiddheshDesai 27.04.2023 11:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я скачал Google API Analytics Credentials.json и добавил его в свои функции Azure local.settings.json, как показано ниже:

Мой локальный.settings.json: -

{

"IsEncrypted": false,

"Values": {

"AzureWebJobsStorage": "",

"FUNCTIONS_WORKER_RUNTIME": "python",

"type": "service_account",

"project_id": "quickstart-xxx3603076",

"private_key_id": "xxxxxxxeea5f0d7dc679d23af2160fb0ae4c",

"private_key": "-----BEGIN PRIVATE KEY-----\<private-key>\n-----END PRIVATE KEY-----\n",

"client_email": "starting-account-xxxf9k2gxzg@quickstart-xxx03603076.iam.gserviceaccount.com",

"client_id": "xxxx556667352042599",

"auth_uri": "https://accounts.google.com/o/oauth2/auth",

"token_uri": "https://oauth2.googleapis.com/token",

"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",

"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/starting-account-xxxx0quickstart-xxxx3603076.iam.gserviceaccount.com"

}

Теперь я вызвал указанный выше private_key в своем коде функции, используя этот блок кода: - os.environ["private_key"]

Вызывается private_key в моем коде init.py, как показано ниже:

credentials = os.environ["private_key"]

print(credentials)

Закрытый ключ был зарегистрирован в выводе: -

Вышеупомянутый метод с local.settings.json будет работать только для локальной функции Azure, так как при развертывании вашей функции с локального сервера на портал Azure файл local.settings.json игнорируется git и не является частью среды выполнения.

Итак, чтобы хранить секреты или настройки в функциях Azure на портале>, вы можете добавить те же значения файла учетных данных.json в настройки приложения приложения-функции, как показано ниже:

Я выбрал «Функция Azure» > «Конфигурация» > «Новые параметры приложения» > «Добавить ключ и значение», где ключ — это ваш закрытый_ключ, а значение — значение закрытого ключа. См. ниже: —

В качестве альтернативы можно сохранить свои учетные данные в хранилище ключей Azure и вызвать их в приложении «Функция Azure». См. этот документ

Ответ принят как подходящий

Спасибо за ваши комментарии, @SiddheshDesai! Ваш ответ оказывается половиной решения. Шаг 1 — сохранить все содержимое учетных данных.json в виде одной переменной в local.settings.json или хранилище ключей Azure. Шаг 2, как описано на https://googleapis.dev/python/google-auth/latest/user-guide.html#service-account-private-key-files, заключается в использовании service_account.Credentials.from_service_account_info для создать объект Credentials, который можно передать в BetaAnalyticsDataClient. Мой local.settings.json выглядит так:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "python",    
    "ga4_credentials_json": "{\"type\": \"service_account\",\"project_id\": \" <etc...>
  }
}  

И вот мой рабочий код для объявления клиента:

    json_acct_info = json.loads(os.getenv('ga4_credentials_json'))
    credentials = service_account.Credentials.from_service_account_info(
        json_acct_info)
    scoped_credentials = credentials.with_scopes(
        ['https://www.googleapis.com/auth/analytics.readonly'])

    client = BetaAnalyticsDataClient(credentials=scoped_credentials)

Затем вы просто определяете свой запрос и ответ = client.run_report(request)! Жизнь хороша.

Другие вопросы по теме