Firebase-tools: Ошибка аутентификации ADC: для этого запроса требуются области действия

Созданный на 29 мая 2018  ·  46Комментарии  ·  Источник: firebase/firebase-tools

Привет, я пытаюсь автоматизировать развертывание функций firebase. Когда я запускаю что-то вроде «GOOGLE_APPLICATION_CREDENTIALS =использование firebase--non-interactive --debug »У меня следующая ошибка:

Информация о версии

3.18.5

Информация о платформе

контейнерный узел: 6.14-альпийский

Действия по воспроизведению

/ usr / bin / docker run --rm -v / workspace: / workspace -e GOOGLE_APPLICATION_CREDENTIALS =узел: 6.14-alpine node_modules / firebase-tools / bin / firebase использовать--отлаживать

Ожидаемое поведение

Быть аутентифицированным

Фактическое поведение

[2018-05-29T15: 57: 32.507Z]> для команды требуются области: [«электронная почта», «openid», «https://www.googleapis.com/auth/cloudplatformprojects.readonly», «https: // www. .googleapis.com / auth / firebase »]
[2018-05-29T15: 57: 32.507Z]> попытка аутентификации с использованием учетных данных приложения по умолчанию
[2018-05-29T15: 57: 32.547Z]! Ошибка автоматической авторизации: для этого запроса требуются области действия.
[2018-05-29T15: 57: 32.547Z]> учетные данные не могут быть найдены или получены автоматически

Есть ли у вас предложения?

Самый полезный комментарий

@mbleigh есть обновления? подтверждаете, что на данный момент интерфейс командной строки firebase не может использовать учетную запись службы для развертывания? мы хотим его для инструмента CI. значит, поддержка GOOGLE_APPLICATION_CREDENTIALS не работает?

Все 46 Комментарий

Привет, требуемые учетные данные - это не GOOGLE_APPLICATION_CREDENTIALS, поэтому эта строка вам не поможет.

Вам нужно будет сгенерировать токен CI, а затем запустить команду с флагом --token, см. Https://github.com/firebase/firebase-tools#using -with-ci-systems для получения дополнительной информации.

Привет,
а как насчет https://github.com/firebase/firebase-tools/pull/417 ?
Кажется, что GOOGLE_APPLICATION_CREDENTIALS реализован, и firebase-tools для этого использует google-auto-auth.

Или я ошибаюсь?

Я бы не стал использовать токен CI, потому что я хотел бы аутентифицироваться с помощью учетной записи службы, а не пользователя Google (GSuite или Cloud Identity или что-то еще)

Спасибо

Привет,
кажется, библиотека вызывает firebase-public.firebaseio. com: 443 и имеет код возврата HTTP 200, но ответ 0 байт

Привет, ты прав. Извините, я забыл об этом пиаре. Я не очень хорошо с этим знаком. Майкл, можешь взглянуть, когда вернешься в офис?

Привет, @laurenzlong @mbleigh!
Я обнаружил, что настройка «Domain Wide Authority» для разрешения учетной записи службы для аутентификации.
Но теперь у меня следующая проблема:

GOOGLE_APPLICATION_CREDENTIALS=<path_to_json> firebase deploy --only functions --non-interactive --project=<project_id> --debug

[2018-06-04T09:25:46.202Z] ----------------------------------------------------------------------
[2018-06-04T09:25:46.211Z] CLI Version:   3.18.5
[2018-06-04T09:25:46.212Z] Platform:      linux
[2018-06-04T09:25:46.212Z] Node Version:  v6.14.2
[2018-06-04T09:25:46.212Z] Time:          Mon Jun 04 2018 09:25:46 GMT+0000 (UTC)
[2018-06-04T09:25:46.213Z] ----------------------------------------------------------------------

[2018-06-04T09:25:46.238Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2018-06-04T09:25:46.238Z] > attempting to authenticate via app default credentials
[2018-06-04T09:25:46.445Z] xxxx.x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xx
[2018-06-04T09:25:46.446Z] > retrieved access token via default credentials
[2018-06-04T09:25:46.449Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/projects/<project_id>  

 Mon Jun 04 2018 09:25:46 GMT+0000 (UTC)
[2018-06-04T09:25:47.067Z] <<< HTTP RESPONSE 404 server=nginx, date=Mon, 04 Jun 2018 09:25:47 GMT, content-type=application/json; charset=utf-8, content-length=87, connection=close, x-content-type-options=nosniff
[2018-06-04T09:25:47.069Z] <<< HTTP RESPONSE BODY code=PROJECT_NOT_FOUND, message=The specified project was not found.

У учетной записи службы есть права редактора в проекте, и если я использую учетную запись Google (а не учетную запись svc), проблемы не существует.

Я нашел эту аналогичную проблему (но они используют токен) https://github.com/firebase/firebase-tools/issues/744

Спасибо

Нет, я ошибаюсь.
Если я выполню использование firebase, у меня снова будет:

[2018-06-04T14:39:38.660Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase"]
[2018-06-04T14:39:38.660Z] > attempting to authenticate via app default credentials
[2018-06-04T14:39:38.693Z] ! auto-auth error: Scopes are required for this request.
[2018-06-04T14:39:38.694Z] > no credentials could be found or automatically retrieved

Такое же поведение даже с сервисным аккаунтом, которому назначена роль Owner попытке сделать что-либо с помощью инструмента firebase CLI:

$ export GOOGLE_APPLICATION_CREDENTIALS=account.json
$ firebase list --debug
[2018-06-05T12:15:17.340Z] ----------------------------------------------------------------------
[2018-06-05T12:15:17.343Z] Command:       /usr/local/bin/node /usr/local/bin/firebase list --debug
[2018-06-05T12:15:17.343Z] CLI Version:   3.18.5
[2018-06-05T12:15:17.343Z] Platform:      linux
[2018-06-05T12:15:17.343Z] Node Version:  v10.3.0
[2018-06-05T12:15:17.343Z] Time:          Tue Jun 05 2018 12:15:17 GMT+0000 (UTC)
[2018-06-05T12:15:17.343Z] ----------------------------------------------------------------------

[2018-06-05T12:15:17.347Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase"]
[2018-06-05T12:15:17.348Z] > attempting to authenticate via app default credentials
[2018-06-05T12:15:17.352Z] ! auto-auth error: Scopes are required for this request.
[2018-06-05T12:15:17.352Z] > no credentials could be found or automatically retrieved

Error: Command requires authentication, please run firebase login

Незначительная подсказка заключается в том, что токен доступа пуст (у меня такая же проблема, я декодировал JWT)

Это подразумевается из его формы
xxxx.x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Средний x - это полезная нагрузка данных и имеет размер 1 символ, поэтому явно не очень заполнен.

firebase-tools использует google-auto-auth для получения токена, поэтому я думаю, что проблема может быть там.

К сожалению, новая версия ( 3.18.6 ) по-прежнему не передает authScopes в autoAuth() . Если я добавлю оператор журнала перед этой строкой: https://github.com/firebase/firebase-tools/blob/b2594467d8980c5a1e2b8c4aff3de9877a98b42b/lib/requireAuth.js#L21
Я получаю authScopes: undefined .

Если я добавлю

authScopes = [
  scopes.EMAIL,
  scopes.OPENID,
  scopes.CLOUD_PROJECTS_READONLY,
  scopes.FIREBASE_PLATFORM,
];

перед этой строкой, затем он переходит к получению токена доступа, но терпит неудачу с PROJECT_NOT_FOUND

Также @tomlarkworthy , этот токен OAuth не является JWT, поэтому он не должен содержать среднюю часть. Если вы запустите его в https://developers.google.com/apis-explorer/#search/oauth2/oauth2/v2/oauth2.tokeninfo , он отобразится как действительный токен с "scope": "https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/userinfo.email",

Спасибо! ОК Итак, когда я получаю сообщение об ошибке "Проект не найден". Когда я декодирую токен, у меня есть только одна область видимости « https://www.googleapis.com/auth/cloud-platform ».

Существует разница между «нормальным» лексемы (т.е. один приобретаемой через firebase login ):

{
 "issued_to": "563584335869-fgrhgmd47bqnekij5i8b5pr03ho849e6.apps.googleusercontent.com",
 "audience": "563584335869-fgrhgmd47bqnekij5i8b5pr03ho849e6.apps.googleusercontent.com",
 "user_id": "xxxyyy",
 "scope": "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/plus.me",
 "expires_in": 3484,
 "email": "[email protected]",
 "verified_email": true,
 "access_type": "offline"
}

и один, созданный из учетной записи службы (SA):

{
 "issued_to": "1160xxxx",
 "audience": "1160xxxx",
 "user_id": "1160xxxx",
 "scope": "https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/userinfo.email",
 "expires_in": 3563,
 "email": "[email protected]",
 "verified_email": true,
 "access_type": "offline"
}

Таким образом, похоже, что токен не выпущен справа audience и user_id , который должен быть из https://github.com/firebase/firebase-tools/blob/376678fef91f71de5859f14d8374b2d8d2731980/ lib / api.js # L84

@tomlarkworthy все еще странно, мой authScope равен undefined если я явно не добавлю нужные области. Вы firebase logout перед запуском этого?

Хорошо, этот идентификатор клиента - это клиент oath2, у которого есть очень специфические домены, которые он может работать, настроенные вне досягаемости для нас. И / или требует взаимодействия с пользователем на локальном хосте. Так что получить авторизацию в CI очень сложно.

Я использую свою функцию. У меня не было такой же ошибки, как у вас. У меня есть проект, не похожий на оригинальный плакат.

Если я создаю свой собственный токен из учетной записи службы и передаю его с помощью --token, я получаю: -

HTTP RESPONSE 401 разное = X-Origin, Origin, Accept-Encoding, www-Authenticate = Bearer realm = " https://accounts.google.com/ ", content-type = application / json; charset = UTF-8, date = Thu, 07 Jun 2018 00:16:43 GMT, expires = Thu, 07 Jun 2018 00:16:43 GMT, cache-control = private, max-age = 0, x-content- type-options = nosniff, x-frame-options = SAMEORIGIN, x-xss-protection = 1; режим = блок, сервер = GSE, alt-svc = quic = ": 443"; ma = 2592000; v = "43,42,41,39,35", accept-range = none, connection = close
[2018-06-07T00: 16: 43.786Z] <<< HTTP RESPONSE BODY error = unauthorized_client, error_description = Unauthorized
[2018-06-07T00: 16: 43.791Z]> для команды требуются области: ["электронная почта", "openid", "https://www.googleapis.com/auth/cloudplatformprojects.readonly", "https: // www. .googleapis.com / auth / firebase "]
[2018-06-07T00: 16: 43.792Z]> авторизация через параметр --token
[2018-06-07T00: 16: 43.792Z]> обновление токена доступа с областями: ["электронная почта", "openid", "https://www.googleapis.com/auth/cloudplatformprojects.readonly", "https: / /www.googleapis.com/auth/firebase "]
[2018-06-07T00: 16: 43.793Z] >>> HTTP ЗАПРОС ЗАПРОСА https://www.googleapis.com/oauth2/v3/token
{refresh_token: 'ya29.c.XXXXXXXXXXXX',
client_id: '563584335869-fgrhgmd47bqnekij5i8b5pr03ho849e6.apps.googleusercontent.com',
client_secret: 'j9iVZfS8kkCEFUPaAeJV0sAi',
grant_type: 'refresh_token',
scope: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase '}

Я думаю, что этот клятвенный идентификатор клиента мешает?

@tomlarkworthy не обязательно сложно - сейчас я тестирую конфигурацию с помощью clientId .

О, вы можете переопределить эти значения:

https://github.com/firebase/firebase-tools/blob/376678fef91f71de5859f14d8374b2d8d2731980/lib/api.js

Я попытался создать собственный проект с собственным клиентом oauth и переопределить инструменты firebase client_id и secret_id. Затем я авторизовал веб-приложение oath, скопировал токен и использовал его для вызова инструментов firebase. Он идет немного другим путем и успешно обновляет токен, но затем не может получить список проектов. Я подтвердил в декодере токенов, что у него была область видимости cloudplatformprojects только для чтения, поэтому он должен был их прочитать.

информация: stderr: [2018-06-07T01: 02: 21.126Z] Переопределения Env: FIREBASE_CLIENT_ID, FIREBASE_CLIENT_SECRET
[2018-06-07T01: 02: 21.126Z] -------------------------------------- --------------------------------

info: stderr: [2018-06-07T01: 02: 21.138Z]> для команды требуются области: ["email", "openid", " https://www.googleapis.com/auth/cloudplatformprojects.readonly ", " https : //www.googleapis.com/auth/firebase "," https://www.googleapis.com/auth/cloud-platform "]

info: stderr: [2018-06-07T01: 02: 21.138Z]> авторизация через параметр --token
[2018-06-07T01: 02: 21.140Z]> обновление токена доступа с областями: ["электронная почта", "openid", "https://www.googleapis.com/auth/cloudplatformprojects.readonly", "https: / /www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform "]
[2018-06-07T01: 02: 21.140Z] >>> HTTP ЗАПРОС ЗАПРОСА https://www.googleapis.com/oauth2/v3/token
{refresh_token: 'ya29.XXX',
client_id: '278696186940-fbqtl733l62g4qj8aekr4i66cpo0k5c1.apps.googleusercontent.com',
client_secret: "XXXX",
grant_type: 'refresh_token',
область действия: 'электронная почта openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/cloud-platform '}
Ср 06 июн 2018 18:02:21 GMT-0700 (PDT)

информация: stderr: [2018-06-07T01: 02: 21.318Z] <<< ОТВЕТ HTTP 200 x-google-netmon-label = / bns / ph / borg / ph / bns / apiserving / prod_hightraffic_api_frontend.server / 998, x -google-gfe-backend-request-info = eid = HYQYW5jODYyytgbB3JfoAg, cache-control = no-cache, no-store, max-age = 0, must-revalidate, pragma = no-cache, expires = Mon, 01 января 1990 г. 00:00:00 GMT, date = Thu, 07 Jun 2018 01:02:21 GMT, var = X-Origin, Origin, Accept-Encoding, x-google-session-info = GgIYBiAB, content-type = application / json ; charset = UTF-8, x-content-type-options = nosniff, x-frame-options = SAMEORIGIN, x-xss-protection = 1; mode = block, server = GSE, x-google-servertype = apiserving, x-google-gfe-request-trace = acsfoh11: 443, phnm21-v6: 9897, / bns / ph / borg / ph / bns / apiserving / prod_hightraffic_api_frontend .server / 998, phnm21-v6: 9897, acsfoh11: 443, x-google-gslb-service = apiserving-hightraffic, x-google-backends = plbn61: 9882, / bns / ph / borg / ph / bns / apiserving / prod_hightraffic_api_frontend.server / 998, phnm21-v6: 9897, / bns / ph / borg / ph / bns / traffic-prod / shared-layer2-gfe / 495, acsfoh11: 443, x-google-dos-service-trace = main : identity-o-auth-2-service-migration , main: shared-layer2-gfe , x-google-service = identity-o-auth-2-service-migration, limited-shared-layer2-grpc-aggregate, x -google-gfe-response-code-details-trace = response_code_set_by_backend, response_code_set_by_backend, x-google-gfe-response-body-transformations = gunzipped, x-google-shellfish-status = CA0gBEBG, alt-svc = quic = ": 443 "; ma = 2592000; v = "43,42,41,39,35", x-google-gfe-service-trace = identity-o-auth-2-service-migration, limited-shared-layer2-grpc-aggregate, accept-range = нет, соединение = закрыть

информация: stderr: [2018-06-07T01: 02: 21.319Z] >>> HTTP-ЗАПРОС ПОЛУЧИТЬ https://admin.firebase.com/v1/projects/docsite-go

Ср 06 июн 2018 18:02:21 GMT-0700 (PDT)

info: stderr: [2018-06-07T01: 02: 21.652Z] <<< HTTP RESPONSE 404 server = nginx, date = Thu, 07 Jun 2018 01:02:21 GMT, content-type = application / json; charset = utf-8, длина-содержимого = 87, соединение = закрыть, x-content-type-options = nosniff

info: stderr: [2018-06-07T01: 02: 21.652Z] <<< HTTP RESPONSE BODY code = PROJECT_NOT_FOUND, message = Указанный проект не найден.

@tomlarkworthy переопределение client_id и secret с пользовательскими значениями не будет работать, потому что Firebase в настоящее время использует предварительно определенный клиент, который отделен от любых проектов клиентов (по крайней мере, в моем понимании).

Кроме того, опция --token поддерживает только токен обновления, который вы не получите, если у вас есть учетная запись службы (опять же, насколько я понимаю).

Нам нужно найти простой способ сгенерировать токен доступа SA с этим идентификатором клиента, если это возможно.

Возможно, можно будет пойти по альтернативному маршруту и ​​вызвать API Firebase с клиентским JWT вместо токена OAuth, как описано здесь: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt -auth

google / google-auth-library-nodejs , который используется внутри stephenplusplus / google-auto-auth , предоставляет более удобный / безопасный способ для этого.

Я не думаю, что мы сможем добиться прогресса.

https://github.com/firebase/firebase-tools/issues/647#issuecomment -361926336, похоже, ранее сообщал об успехе, хотя не уверен, подтверждено ли это. Похоже, что рассматриваемый API Firebase (https://admin.firebase.com/v1/projects) является частным и принимает только токены, созданные для этого идентификатора клиента.

Возможно, это следует подать как запрос функции - возможность использовать учетную запись службы для развертывания позволит использовать единые учетные данные (и не связанные с любым пользователем) для развертывания ресурсов Firebase и GCP.

Параметр --token в интерфейсе командной строки предназначен для передачи токена обновления , а не токена доступа. Это тот, который генерируется из firebase login:ci .

Я не тестировал авторизацию учетной записи службы как следует, но подозреваю, что в бэкэнде admin.firebase.com может быть проверка IAM, требующая широкого доступа. Мы можем продолжить исследование, но я не ожидал бы здесь сверхбыстрого разрешения.

Параметр --token в интерфейсе командной строки предназначен для передачи токена обновления.

Ага, понятно, как указано выше.

Было бы замечательно использовать ключ SA для развертывания из сред CI. Токен обновления привязан к конкретному пользователю, и непонятно, как его использовать для аутентификации команд gcloud для администрирования других сервисов GCP. В настоящее время мы должны предоставить оба типа учетных данных (токен обновления администратора для Firebase CLI и ключ SA для gcloud ).

Я могу FIREBASE_TOKEN='<token_here>' firebase deploy --only firestore,storage (я не пробовал другие цели, возможно, они работают), используя токен, созданный для учетной записи службы.

Фактический токен был сгенерирован для учетной записи службы механизмом секретов GCP хранилища с областью действия « https://www.googleapis.com/auth/cloud-platform ».

Я подтверждаю, что невозможно использовать ключ SA + GOOGLE_APPLICATION_CREDENTIALS с последней версией firebase cli, любые команды завершаются с:

root<strong i="6">@frontend</strong>:/usr/src/app$ firebase list

Error: HTTP Error: 404, The specified project was not found.

Having trouble? Try firebase list --help

@cpick , это интересно, знаете ли вы, как хранилище генерирует токены oauth для учетной записи службы?

@paolomainardi firebase list не будет работать с ключом SA, потому что это зависит от реализации листинга унаследованного проекта. Однако почти все остальное должно (хотя вам может потребоваться сначала включить несколько API). Я бы порекомендовал попробовать другую команду и посмотреть.

Мы работаем над тем, чтобы получить полную поддержку для GOOGLE_APPLICATION_CREDENTIALS не прыгая через кучу препятствий, потому что мы думаем, что это открывает некоторые отличные варианты использования.

@paolomainardi Я думаю, что реализация vault уже здесь (это всего лишь предположение после быстрого поиска по ее коду).

Я также думаю, что это то же самое, что делает gcloud alpha iam service-accounts sign-jwt (опять же, несколько обоснованное предположение).

Большое спасибо @cpick , буду держать вас в курсе.

Я кратко взглянул на это и в качестве теста попытался принудительно ввести учетные данные учетной записи службы и access_token в requireAuth.js
в попытке хотя бы увидеть, что что-то работает.

Кажется, что cli всегда пытается связаться с https://admin.firebase.com/v1/projects/ несмотря ни на что (вы можете, что я имею в виду, с флагом --debug . Если я прочитаю предыдущий комментарий в этом выпуске, это может быть Конечная точка api, которая не работает с учетными записями svc.

Я тестировал некоторые другие конечные точки с простыми вызовами GET и они, похоже, в порядке:

для исх.


  • Жестко закодированная модификация, которую я сделал в requireAuth.js только для тестирования, которая вернет токен доступа svc_accounts с широкими областями
function getServiceAccountClient() {
  const credFile = '/path/to/cert.json';
  const keys = require(credFile);
  let client = new JWT(
    keys.client_email,
    null,
    keys.private_key,
    ["email","openid","https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase"],
  );
  return client;
};

function _autoAuth(options, authScopes) {
  return new Promise(function(resolve, reject) {
    var client = getServiceAccountClient();
    client.getAccessToken().then(res => {
      console.log(res);
     api.setAccessToken(res.token);
     resolve();

    }).catch(function (error) {
      console.error('Unable to recall targetClient access_token ' + error);
    });    

    /*
        logger.debug("> attempting to authenticate via app default credentials");
 ......

  • Стандартный клиент
const {JWT} = require('google-auth-library');

function getServiceAccountClient() {
    const credFile = '/path/to/cert.json';
    const keys = require(credFile);

    let client = new JWT(
      keys.client_email,
      null,
      keys.private_key,
      ["email","openid","https://www.googleapis.com/auth/cloud-platform", "https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase"],
    );
    return client;
  };

  var client = getServiceAccountClient();
    let project_id = 'your_project';
    let url = 'https://admin.firebase.com/v1/projects/' + project_id
    //let url = "https://firestore.googleapis.com/v1beta1/projects/" + project_id + "/databases/(default)/indexes"
    //let url = "https://firebaserules.googleapis.com/v1/projects/" + project_id  + "/rulesets" 

    client.requestAsync({url}).then(resp => {
      console.log(resp.data);
    }).catch(function (error) {
      console.error('Unable to list buckets: ' + error);
    }); 

Я могу, наконец, развернуть с помощью учетной записи службы firestore , storage и hosting после внесения изменений в requireAuth.js, как показано в этой сущности.
АЦП, который уже был там ..>

Следующее, в основном, является хакерским и неполным, потому что оно не работает с развертыванием functions . Полное решение, упомянутое выше mbleigh для «первоклассной поддержки», заслуживает ожидания.


Во всяком случае, я проверил это следующим образом:

Начните с учетной записи firebase, которая также находится в контексте с gcloud

  1. Получите закрытый ключ сервисного аккаунта
$ gcloud iam service-accounts list
NAME                                EMAIL
App Engine default service account  [email protected]
firebase-adminsdk                   firebase-adminsdk-h2v8k@firebase-auth-sal.iam.gserviceaccount.com

gcloud iam service-accounts keys  create `pwd`/svc.json --iam-account=firebase-adminsdk-h2v8k@firebase-auth-sal.iam.gserviceaccount.com
  1. Добавьте сервисный аккаунт как OWNER в этот проект.

  2. Перейдите в облачную консоль и включите некоторые API:

https://console.developers.google.com/apis/api/cloudresourcemanager.googleapis.com/overview?project=<your_project>

https://console.developers.google.com/apis/api/firebasehosting.googleapis.com/overview?project=<your_project>
  1. Удалить локальные учетные данные

Для gcloud и firebase

$ firebase logout
✔  Logged out from [email protected]

$ mv ~/.config/gcloud ~/.config/gcloud_backup
  1. Установите ADC env-var и разверните
export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/svc.json

$ firebase deploy -P firebase-auth-sal --only firestore,hosting,storage 
{ token: 'ya29.c.EmJ8B....',  res: null }

=== Deploying to 'firebase-auth-sal'...

i  deploying storage, firestore, hosting
i  storage: checking storage.rules for compilation errors...
✔  storage: rules file storage.rules compiled successfully
i  firestore: checking firestore.rules for compilation errors...
i  firestore: reading indexes from firestore.indexes.json...
✔  firestore: rules file firestore.rules compiled successfully
i  storage: uploading rules storage.rules...
i  firestore: uploading rules firestore.rules...
✔  firestore: deployed indexes in firestore.indexes.json successfully
i  hosting[fir-auth-sal]: beginning deploy...
i  hosting[fir-auth-sal]: found 1 files in public
✔  hosting[fir-auth-sal]: file upload complete
✔  storage: released rules storage.rules to firebase.storage/firebase-auth-sal.appspot.com
✔  firestore: released rules firestore.rules to cloud.firestore
i  hosting[fir-auth-sal]: finalizing version...
✔  hosting[fir-auth-sal]: version finalized
i  hosting[fir-auth-sal]: releasing new version...
✔  hosting[fir-auth-sal]: release complete

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/firebase-auth-sal/overview
Hosting URL: https://fir-auth-sal.firebaseapp.com
  1. Проверить развертывание

deployment_hosting

  1. Попытка развертывания functions

Типы развертывания functions не работают, даже если я попытался переопределить проверки включения ниже (он останавливается при доступе к какой-либо другой конечной точке mobilesdk.googleapis.com . Возможно, развертывание функций firebase привязано к client_id для функций firebase или каким-то образом требует 3LO .... но это все предположения

$ firebase deploy -P firebase-auth-sal --only functions --debug

[2018-12-24T01:36:44.034Z] >>> HTTP REQUEST GET https://servicemanagement.googleapis.com/v1/services/cloudfunctions.googleapis.com/projectSettings/firebase-auth-sal?view=CONSUMER_VIEW  

[2018-12-24T01:36:44.034Z] >>> HTTP REQUEST GET https://servicemanagement.googleapis.com/v1/services/runtimeconfig.googleapis.com/projectSettings/firebase-auth-sal?view=CONSUMER_VIEW  

[2018-12-24T01:36:44.486Z] <<< HTTP RESPONSE 404 vary=X-Origin, Referer, Origin,Accept-Encoding, content-type=application/json; charset=UTF-8, date=Mon, 24 Dec 2018 01:36:44 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close
[2018-12-24T01:36:44.486Z] <<< HTTP RESPONSE BODY code=404, message=Method not found., status=NOT_FOUND

Error: HTTP Error: 404, Method not found.
[2018-12-24T01:36:44.495Z] Error Context: {
  "body": {
    "error": {
      "code": 404,
      "message": "Method not found.",
      "status": "NOT_FOUND"

Ссылка на внутреннюю ошибку: 122552119

Есть ли обновления по этому поводу @tinaliang ? Я считаю, что поддержка аутентификации сервисным аккаунтом должна иметь высокий приоритет.

В настоящее время обновлений нет ...

В последние дни я пришел к выводу, что мне не нужны специальные функции Firebase Cloud, поэтому я могу использовать функции GCP Cloud https://cloud.google.com/functions/, которые работают должным образом (развертывание выполняется через интерфейс командной строки gcloud). не настоящий обходной путь ... но это может быть полезно для кого-то :)

Дублируется # 1175

Есть ли обновления? Я попытался развернуть приложение Firebase через Cloud Build. hosting и т. Д., Похоже, работают и развертываются правильно. functions не будет развернут правильно, и я получаю 404 , как описано выше, с правильной конфигурацией в IAM. (У служебного аккаунта cloudbuild есть права на "Firebase Admin" и "API Keys Admin".) Этот билет должен иметь высокий приоритет 🔥

Обновлений пока нет, но мы надеемся взглянуть на них в ближайшее время.

@mbleigh есть обновления? подтверждаете, что на данный момент интерфейс командной строки firebase не может использовать учетную запись службы для развертывания? мы хотим его для инструмента CI. значит, поддержка GOOGLE_APPLICATION_CREDENTIALS не работает?

Как упоминалось ранее, не все команды firebase CLI будут работать с GOOGLE_APPLICATION_CREDENTIALS , но хорошее число должно. Все, что вам нужно сделать, это установить путь к учетным данным вашей учетной записи службы (фактически, это то, что, помимо прочего, делает сценарий test-hosting.sh ).

Используя firebase login:ci вы сможете использовать токен в своей системе CI.

Мы думаем о формализации использования и возможностей GOOGLE_APPLICATION_CREDENTIALS , но мы не можем придерживаться графика. Спасибо за ваше терпение.

Не могли бы вы уточнить - будет ли в этом случае работать ADC метаданных экземпляра или только GOOGLE_APPLICATION_CREDENTIALS ?

Кто-нибудь в этой ветке: если вы любите приключения, я бы хотел, чтобы вы опробовали ветку на # 1463 и посмотрели, позволяет ли она вам делать то, что вы хотите делать, с авторизацией учетной записи службы. Я думаю, что мы, возможно, решили большинство проблем, но мне бы хотелось провести какое-то внешнее тестирование.

@mbleigh firebase apps:list web будет периодически выходить из строя в половине случаев в Cloud Build. Запуск с отладкой не дает нам никакой информации о причине сбоя. Есть мысли о том, в чем может быть дело?

[2020-02-13T21:25:55.987Z] ----------------------------------------------------------------------
[2020-02-13T21:25:55.991Z] Command:       /usr/local/bin/node /workspace/node_modules/.bin/firebase apps:list web -j --project=projectName --debug
[2020-02-13T21:25:55.991Z] CLI Version:   7.12.1
[2020-02-13T21:25:55.991Z] Platform:      linux
[2020-02-13T21:25:55.991Z] Node Version:  v10.18.0
[2020-02-13T21:25:55.992Z] Time:          Thu Feb 13 2020 21:25:55 GMT+0000 (Coordinated Universal Time)
[2020-02-13T21:25:55.992Z] ----------------------------------------------------------------------

Кроме того, команда @mbleigh firebase use projectName также периодически завершается ошибкой, поскольку не может получить правильные учетные данные с сервера метаданных:

[2020-02-13T21:49:41.050Z] ----------------------------------------------------------------------
[2020-02-13T21:49:41.055Z] Command:       /usr/bin/node /directory/node_modules/.bin/firebase --debug use projectName
[2020-02-13T21:49:41.056Z] CLI Version:   7.12.1
[2020-02-13T21:49:41.056Z] Platform:      linux
[2020-02-13T21:49:41.056Z] Node Version:  v10.16.3
[2020-02-13T21:49:41.056Z] Time:          Thu Feb 13 2020 21:49:41 GMT+0000 (Coordinated Universal Time)
[2020-02-13T21:49:41.056Z] ----------------------------------------------------------------------
[2020-02-13T21:49:41.057Z] 
[2020-02-13T21:49:41.073Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2020-02-13T21:49:41.073Z] > attempting to authenticate via app default credentials
[2020-02-13T21:49:41.669Z] TypeError: Cannot create property 'refresh_token' on string 'Not Found
'
    at /directory/node_modules/google-auto-auth/node_modules/google-auth-library/lib/auth/oauth2client.js:208:28
    at /directory/node_modules/google-auto-auth/node_modules/google-auth-library/lib/auth/computeclient.js:85:7
    at Request._callback (/directory/node_modules/google-auto-auth/node_modules/google-auth-library/lib/transporters.js:106:7)
    at Request.self.callback (/directory/node_modules/request/request.js:185:22)
    at Request.emit (events.js:198:13)
    at Request.EventEmitter.emit (domain.js:448:20)
    at Request.<anonymous> (/directory/node_modules/request/request.js:1161:10)
    at Request.emit (events.js:198:13)
    at Request.EventEmitter.emit (domain.js:448:20)
    at IncomingMessage.<anonymous> (/directory/node_modules/request/request.js:1083:12)
    at Object.onceWrapper (events.js:286:20)
    at IncomingMessage.emit (events.js:203:15)
    at IncomingMessage.EventEmitter.emit (domain.js:448:20)
    at endReadableNT (_stream_readable.js:1145:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

По состоянию на 10.02.20 я начал замечать периодические сбои при использовании cloudbuild для развертывания на хостинге firebase при использовании учетной записи службы. Какое-то время до этого все было стабильно хорошо, а теперь кажется, что это чаще всего терпит неудачу. Я начинаю задаваться вопросом, есть ли новый набор разрешений, который мне нужно передать учетной записи службы, чтобы она могла это сделать успешно. Это стало проблемой, поскольку большинство моих развертываний просто терпят неудачу 😞

Ниже приведен снимок экрана с примером сборок и случаев, когда они внезапно начали давать сбой:

image

Ошибка отладки очень похожа на комментарий выше:

[2020-02-16T07:30:46.905Z] ----------------------------------------------------------------------
[2020-02-16T07:30:46.908Z] Command:       /usr/local/bin/node /home/node/.npm-global/bin/firebase deploy --only hosting -P project-production --debug
[2020-02-16T07:30:46.908Z] CLI Version:   7.8.1
[2020-02-16T07:30:46.908Z] Platform:      linux
[2020-02-16T07:30:46.909Z] Node Version:  v12.13.1
[2020-02-16T07:30:46.909Z] Time:          Sun Feb 16 2020 07:30:46 GMT+0000 (Coordinated Universal Time)
[2020-02-16T07:30:46.910Z] ----------------------------------------------------------------------
[2020-02-16T07:30:46.910Z] 
[2020-02-16T07:30:46.920Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2020-02-16T07:30:46.920Z] > attempting to authenticate via app default credentials
[2020-02-16T07:30:47.023Z] TypeError: Cannot create property 'refresh_token' on string 'Not Found
'
    at /home/node/.npm-global/lib/node_modules/firebase-tools/node_modules/google-auto-auth/node_modules/google-auth-library/lib/auth/oauth2client.js:208:28
    at /home/node/.npm-global/lib/node_modules/firebase-tools/node_modules/google-auto-auth/node_modules/google-auth-library/lib/auth/computeclient.js:85:7
    at Request._callback (/home/node/.npm-global/lib/node_modules/firebase-tools/node_modules/google-auto-auth/node_modules/google-auth-library/lib/transporters.js:106:7)
    at Request.self.callback (/home/node/.npm-global/lib/node_modules/firebase-tools/node_modules/request/request.js:185:22)
    at Request.emit (events.js:210:5)
    at Request.EventEmitter.emit (domain.js:475:20)
    at Request.<anonymous> (/home/node/.npm-global/lib/node_modules/firebase-tools/node_modules/request/request.js:1161:10)
    at Request.emit (events.js:210:5)
    at Request.EventEmitter.emit (domain.js:475:20)
    at IncomingMessage.<anonymous> (/home/node/.npm-global/lib/node_modules/firebase-tools/node_modules/request/request.js:1083:12)
    at Object.onceWrapper (events.js:299:28)
    at IncomingMessage.emit (events.js:215:7)
    at IncomingMessage.EventEmitter.emit (domain.js:475:20)
    at endReadableNT (_stream_readable.js:1184:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)

Error: An unexpected error has occurred.

Похоже, это связано с https://github.com/firebase/firebase-tools/issues/1970 (а именно, отказ от старых конечных точек метаданных экземпляра v1beta1 , которые все еще используются старым gcloud Auth библиотека, используемая Firebase CLI ..)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги