Вопрос или проблема
Наконец, я попытался настроить проект Google, используя Terraform с бекендом, который должен использовать экземпляр Firebase Auth для проверки. Для этого мне нужен файл учетных данных, который обычно генерируется в веб-консоли Firebase в Настройки проекта
> Служебные аккаунты
> Firebase Admin SDK
> Сгенерировать новый закрытый ключ
.
Поскольку я хочу автоматизировать получение этого файла, я искал, как сгенерировать этот файл самостоятельно с помощью Terraform, но не нашел никакой документации на эту тему. Структура файла выглядит следующим образом:
{
"auth_provider_x509_cert_url":
"auth_uri":
"client_email":
"client_id":
"client_x509_cert_url":
"private_key":
"private_key_id":
"project_id":
"token_uri":
"type":
"universe_domain":
}
В проекте я установлю переменную env
с GOOGLE_APPLICATION_CREDENTIALS="/firebase-service-account.json"
, чтобы указать, где найти мой файл учетных данных.
В моем файле Terraform я делаю что-то вроде этого:
resource "google_service_account" "sa_backend_firebase_adminsdk" {
account_id = "sa-backend-firebase-adminsdk"
display_name = "Backend Firebase SDK SA"
project = var.GCLOUD_PROJECT_ID
}
resource "google_service_account_key" "sa_backend_firebase_adminsdk_key" {
service_account_id = google_service_account.sa_backend_firebase_adminsdk.name
private_key_type = "TYPE_GOOGLE_CREDENTIALS_FILE"
}
locals {
private_key_id = split("/", google_service_account_key.sa_backend_firebase_adminsdk_key.id)[5]
service_key_account_json = jsonencode({
type = "service_account",
project_id = "${var.GCLOUD_PROJECT_ID}",
private_key_id = "${local.private_key_id}",
private_key = "-----BEGIN PRIVATE KEY-----\n${local.private_key}\n-----END PRIVATE KEY-----\n",
client_email = "${google_service_account.sa_backend_firebase_adminsdk.email}",
client_id = "${google_service_account.sa_backend_firebase_adminsdk.unique_id}",
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/${google_service_account.sa_backend_firebase_adminsdk.email}",
universe_domain = "googleapis.com"
})
}
resource "local_sensitive_file" "sa_backend_firebase_adminsdk_private_key_file" {
content = local.service_key_account_json
filename = "${path.module}/${var.GCLOUD_PROJECT_NAME}-private-key.json"
}
Наконец, у меня есть два дополнительных вопроса по этому поводу, потому что они могут вызвать проблемы с работой процесса:
- Оригинальный файл SDK Firebase Admin включает для
client_x509_cert_url
https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-`39pwf%40m`, в то время как мой сгенерированный файл включает https://www.googleapis.com/robot/v1/metadata/x509/sa-backend-firebase-adminsdk`@` - Оригинальный закрытый ключ разделен \n и имеет совершенно другую длину, чем тот, который я генерирую.
- Является ли файл AdminSDK учетной записи службы эквивалентом ADC (=Application Default Credentials), упомянутым Google, и является ли предоставленный формат JSON правильным форматом для выполнения требований файла ADC? (Так как я не нашел никакой документации на эту тему)
Ответ или решение
Для автоматизации получения учетных данных Firebase Admin SDK (ADC) с использованием Terraform, необходимо учесть несколько важных шагов и нюансов. Давайте разберем процесс создания учетных данных, а также ответим на ваши вопросы.
Шаги по генерации учетных данных для Firebase Auth с помощью Terraform
-
Создание службы учетной записи: Вам нужно создать службу учетной записи в Google Cloud, которая будет использоваться для аутентификации с Firebase.
resource "google_service_account" "sa_backend_firebase_adminsdk" { account_id = "sa-backend-firebase-adminsdk" display_name = "Backend Firebase SDK SA" project = var.GCLOUD_PROJECT_ID }
-
Создание ключа для службы учетной записи: Следующим шагом является создание ключа для этой службы учетной записи. Это действие предоставит вам закрытый ключ, который необходимо для работы с Firebase Admin SDK.
resource "google_service_account_key" "sa_backend_firebase_adminsdk_key" { service_account_id = google_service_account.sa_backend_firebase_adminsdk.name private_key_type = "TYPE_GOOGLE_CREDENTIALS_FILE" }
-
Формирование JSON-файла с учетными данными: Вам нужно будет сформировать JSON-файл с необходимыми атрибутами для вашей службы учетной записи. Это включает такие поля как
project_id
,private_key
,client_email
и другие.locals { private_key_id = split("/", google_service_account_key.sa_backend_firebase_adminsdk_key.id)[5] private_key = google_service_account_key.sa_backend_firebase_adminsdk_key.private_key service_key_account_json = jsonencode({ type = "service_account", project_id = var.GCLOUD_PROJECT_ID, private_key_id = local.private_key_id, private_key = "-----BEGIN PRIVATE KEY-----\n${local.private_key}\n-----END PRIVATE KEY-----\n", client_email = google_service_account.sa_backend_firebase_adminsdk.email, client_id = google_service_account.sa_backend_firebase_adminsdk.unique_id, 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/${google_service_account.sa_backend_firebase_adminsdk.email}", universe_domain = "googleapis.com" }) }
-
Сохранение в файл: В конце вам необходимо сохранить созданный JSON в виде файла, который будет использоваться вашим приложением.
resource "local_sensitive_file" "sa_backend_firebase_adminsdk_private_key_file" { content = local.service_key_account_json filename = "${path.module}/${var.GCLOUD_PROJECT_NAME}-private-key.json" }
Ответы на ваши вопросы
-
Разница в URL для
client_x509_cert_url
:
Разница заключается в том, чтоclient_x509_cert_url
содержит уникальный идентификатор для вашей службы учетной записи. Ваша учетная запись имеет свой собственный уникальный идентификатор, который будет отличаться от любого другого. Важно, чтобы этот URL указывал на вашу конкретную службу, и не следует с этим беспокоиться. -
Длина и формат частного ключа:
Закрытый ключ обрабатывается сервисом Google, и его формат может изменяться. Следовательно, длина ключа может варьироваться, и, возможно, вы получите ключ в другом формате. Главное, чтобы этот ключ был корректным и не содержал ошибок при создании. При использовании встроенной функцииgoogle_service_account_key
вы получите корректный ключ. -
Равенство между AdminSDK и ADC:
Да, файлы учетных данных для AdminSDK служат для аутентификации ваших приложений с использованием Firebase и являются реализацией Application Default Credentials. Предоставленный вами JSON-формат соответствует требованиям ADC и должен работать без проблем, при условии корректного указания всех параметров.
В заключение, использование Terraform для автоматической генерации учетных данных Firebase легко реализуется и эффективно автоматизирует процесс развертывания. Убедитесь, что ваша учетная запись имеет необходимые разрешения для всех выполняемых действий.