Создание golang, включая файл учетных данных Firebase.json
Я написал программу Golang, предназначенную для синтаксического анализа файла scv и загрузки данных в FireStore. Эта программа была создана для того, чтобы делиться ею с людьми, которые просто пишут путь scv для загрузки информации.
Я использую это, чтобы использовать firebase-admin:
opt := option.WithCredentialsFile("path/to/serviceAccountKey.json")
Этот подход прекрасно работает, когда я:
$ go run main.go
но когда я строю проект и выполняю двоичный файл, я получаю это:
$ cannot read credentials file: open firebase-config.json: no such file or directory
Я читал этот подход, но это также означает использование firebase-config.json, идея этой программы на Go - просто поделиться исполняемым файлом без какой-либо другой документации.
Есть ли способ собрать программу, включающую json или аутентифицировать firebase-admin, используя json напрямую, как это?:
opt := option.WithCredentials({< authentication json >})
У меня нет найденной документации или примеров использования этого метода WithCredential.
4 ответа
Я не знаю, если это лучший способ решить эту проблему, но я так и сделал:
- Я решил поместить этот исполняемый файл скрипта в / opt /
/bin - Я написал дополнительную функцию, которая создает auth .json / opt /
/auth .json - Весь скрипт выполняется с использованием этого файла / opt /
/auth .json - Я пишу другую функцию, которая удаляет auth .json, когда выполнение заканчивается
Итак, теперь я могу сделать это:
var file string = "/opt/< dir-name >/auth.json"
sa := option.WithCredentialsFile(file)
Теперь я могу поделиться этим сценарием с директивой "Установить в / opt /
Для меня я использую $GOPATH, чтобы исправить эту проблему
- Например, мой $GOPATH это / home / Frank / work
- Я поместил свой файл .json в /home/Frank/work/myfile.json
Я изменяю свой код на
opt:= option.WithCredentialsFile("/home/Frank/work/myfile.json")
И как-то это работает.:D
Добавление учетных данных в ваш код небезопасно, информация может просочиться через ваше приложение или исходный код.
Вместо этого используйте переменную среды, как описано в документации по установке Firebase :
Вы можете установить
GOOGLE_APPLICATION_CREDENTIALS
переменная среды или вы можете явно передать путь к ключу учетной записи службы в коде. Первый вариант более безопасен и настоятельно рекомендуется.
Шаг 1: Удалить вызов WithCredentialsFile()
Поскольку переменная среды будет использоваться автоматически, вам не нужно специально загружать файл учетных данных, просто вызовитеNewApp()
:
app, err := firebase.NewApp(context.Background(), nil)
if err != nil {
log.Fatalf("error initializing app: %v\n", err)
}
Шаг 2: Установите переменную среды
Установите переменную среды перед запуском кода:
$ export GOOGLE_APPLICATION_CREDENTIALS="./conf/solarsink-firebase-adminsdk.json"
$ go run .
Если вы используете VSCode, вы также можете добавить эту переменную среды вlaunch.json
:
"configurations": [
{
"name": "test",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}",
"args": [
"-test.run",
"TestStatus"
],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "./conf/solarsink-firebase-adminsdk.json"
}
}
]
Я столкнулся с этой проблемой с firebase-admin
при попытке переместить мои облачные функции Google, написанные с помощью Node, в Google Cloud Run (GCR) с помощью Go. В частности, ошибка Ошибка инициализации приложения: невозможно прочитать файл учетных данных: открыть./firebase.json: нет такого файла или каталога
Я не уверен, почему, но когда я отправил свой контейнер в GCR, файл JSON был потерян, и я не смог подключиться к firebase-admin
. Я предполагаю, что это похоже на то, как вы говорите, что программы Go в теории должны быть самодостаточными.
Я считаю, что нашел решение этой проблемы, которое соответствует моим потребностям, надеюсь, оно вам поможет.
opt := option.WithCredentialsJSON([]byte(`{"some": "json"}`))
Это означает, что файл JSON помещается в одну строку, что абсолютно не должно работать во всех ситуациях. Однако с учетом того, насколько малы файлы firebase.json в целом, это должно быть нормально для этого варианта использования IMO.
Ссылки, которые ведут меня по этому пути, оставлены в конце на случай, если эти ссылки изменятся или сломаются:
- https://github.com/googleapis/google-api-go-client/issues/293 (предложение использовать массив байтов)
- https://code-review.googlesource.com/c/google-api-go-client/+/33410 (проверка кода для предложения)
- https://code-review.googlesource.com/c/google-api-go-client/+/33410/4/option/option_test.go (тестовый файл, показывающий реализацию.)