Могу ли я использовать токен аутентификации пользователя в Firebase CLI в качестве учетных данных для Firebase Admin SDK?

Если вы используете Firebase-tools в качестве модуля, вы можете получить токен обновления пользователя, выполнив

import { getGlobalDefaultAccount } from "firebase-tools/lib/auth.js";
const account = getGlobalDefaultAccount();
console.info(account.tokens.refresh_token);

Я ищу способ использовать токен обновления вошедшего в систему пользователя (firebase-tools) в качестве учетных данных для Firebase Admin SDK. Что-то вроде:

import { initializeApp, refreshToken } from "firebase-admin/app";

const admin = initializeApp({
  credential: refreshToken(account.tokens.refresh_token),
});

Я попробовал запустить приведенный выше фрагмент кода, но похоже, что метод refreshToken интерпретирует account.tokens.refresh_token как путь к файлу (возможно, потому, что это строка). Поэтому я попытался изменить его на такой объект:

import { initializeApp, refreshToken } from "firebase-admin/app";

const admin = initializeApp({
  credential: refreshToken({
    refresh_token: account.tokens.refresh_token,
  }),
});

Однако теперь он выдает ошибку о том, что отсутствуют свойства client_secret и client_id, которых нет у объекта account. AFAIK, они есть только у сервисных учетных записей.

🤔 А знаете ли вы, что...
Node.js позволяет выполнять JavaScript на стороне сервера, а не только в браузере.


51
1

Ответ:

Решено

Итак, я понял, что это возможно, используя GOOGLE_APPLICATION_CREDENTIALS.

В Firebase Tools есть метод getCredentialPathAsync(), который, насколько я могу судить, находит файл учетных данных где-то на вашем компьютере, а если его нет, он генерирует файл учетных данных, а затем возвращает путь. Вы можете установить GOOGLE_APPLICATION_CREDENTIALS в местоположении этого файла.

import { getGlobalDefaultAccount } from "firebase-tools/lib/auth.js";
import { getCredentialPathAsync } from "firebase-tools/lib/defaultCredentials.js";
import { initializeApp } from "firebase-admin/app";

async function main() {
    const account = getGlobalDefaultAccount() // Get the logged in account
    const credPath = await getCredentialPathAsync(account) // Get the path
    process.env.GOOGLE_APPLICATION_CREDENTIALS = credPath // Set the environment variable
    const firebaseApp = initializeApp({
        projectId: "PROJECT_ID",
    }) // Initialize the Admin SDK
}

main()