Создание 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 ответа

Решение

Я не знаю, если это лучший способ решить эту проблему, но я так и сделал:

  1. Я решил поместить этот исполняемый файл скрипта в / opt //bin
  2. Я написал дополнительную функцию, которая создает auth .json / opt //auth .json
  3. Весь скрипт выполняется с использованием этого файла / opt //auth .json
  4. Я пишу другую функцию, которая удаляет auth .json, когда выполнение заканчивается

Итак, теперь я могу сделать это:

var file string = "/opt/< dir-name >/auth.json" 
sa := option.WithCredentialsFile(file)

Теперь я могу поделиться этим сценарием с директивой "Установить в / opt //bin и добавить его в свой $ PATH"

Для меня я использую $GOPATH, чтобы исправить эту проблему

  1. Например, мой $GOPATH это / home / Frank / work
  2. Я поместил свой файл .json в /home/Frank/work/myfile.json
  3. Я изменяю свой код на

    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.

Ссылки, которые ведут меня по этому пути, оставлены в конце на случай, если эти ссылки изменятся или сломаются:

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