Firebase-tools: ADC-Authentifizierungsfehler: Für diese Anfrage sind Bereiche erforderlich

Erstellt am 29. Mai 2018  ·  46Kommentare  ·  Quelle: firebase/firebase-tools

Hallo, ich versuche, die Bereitstellung von Firebase-Funktionen zu automatisieren. Wenn ich etwas wie "GOOGLE_APPLICATION_CREDENTIALS= ." ausführeFirebase-Nutzung--non-interactive --debug” Ich habe den folgenden Fehler:

Versions Information

3.18.5

Plattforminformationen

Containerknoten :6.14-alpin

Schritte zum Reproduzieren

/usr/bin/docker run --rm -v /workspace:/workspace -e GOOGLE_APPLICATION_CREDENTIALS=node:6.14-alpine node_modules/firebase-tools/bin/firebase use--debuggen

Erwartetes Verhalten

authentifiziert werden

Tatsächliches Verhalten

[2018-05-29T15:57:32.507Z] > Befehl erfordert Bereiche: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www .googleapis.com/auth/firebase”]
[2018-05-29T15:57:32.507Z] > versucht, sich über die Standard-Anmeldeinformationen der App zu authentifizieren
[2018-05-29T15:57:32.547Z] ! Auto-Authentifizierungsfehler: Für diese Anforderung sind Bereiche erforderlich.
[2018-05-29T15:57:32.547Z] > Es konnten keine Zugangsdaten gefunden oder automatisch abgerufen werden

Haben Sie einige Vorschläge?

Hilfreichster Kommentar

@mbleigh ein Update? Bestätigen Sie, dass die Firebase-CLI ab sofort kein Dienstkonto zum Bereitstellen verwenden kann? wir wollen es für CI-Tool. funktioniert der GOOGLE_APPLICATION_CREDENTIALS-Support nicht?

Alle 46 Kommentare

Hallo, die erforderlichen Anmeldeinformationen sind nicht GOOGLE_APPLICATION_CREDENTIALS, daher hilft Ihnen diese Zeile nicht wirklich.

Sie müssen ein CI-Token generieren und dann den Befehl mit dem Flag --token ausführen. Weitere Informationen finden Sie unter https://github.com/firebase/firebase-tools#using -with-ci-systems.

Hi,
und was ist mit https://github.com/firebase/firebase-tools/pull/417 ?
Es scheint, dass GOOGLE_APPLICATION_CREDENTIALS implementiert ist und Firebase-Tools verwendet google-auto-auth, um dies zu erhalten.

Oder liege ich falsch?

Ich würde kein CI-Token verwenden, weil ich mich mit einem Dienstkonto und nicht mit einem Google-Nutzer (GSuite oder Cloud Identity oder was auch immer) authentifizieren möchte.

Dankeschön

Hi,
es scheint, dass die Bibliothek Firebase-public.firebaseio aufgerufen hat. com:443 und hat einen HTTP-Rückgabecode von 200, aber eine Antwort von 0 Bytes

Hallo, du hast recht. Entschuldigung, ich habe diese PR vergessen. Ich kenne mich damit nicht so gut aus. Michael, kannst du mal nachsehen, wenn du wieder im Büro bist?

Hallo @laurenzlong @mbleigh ,
Ich habe festgestellt, dass die Konfiguration von "Domain Wide Authority" für das Dienstkonto die Authentifizierung erlaubt.
Jetzt habe ich aber folgendes Problem:

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.

Das Dienstkonto hat Editorberechtigungen für das Projekt, und wenn ich eine Google-Identität (kein svc-Konto) verwende, besteht das Problem nicht

Ich habe dieses ähnliche Problem gefunden (aber sie verwenden Token) https://github.com/firebase/firebase-tools/issues/744

Vielen Dank

Nein, ich liege falsch.
Wenn ich Firebase use ausführe

[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

Gleiches Verhalten, auch wenn einem Dienstkonto die Rolle Owner zugewiesen ist, das versucht, etwas mit dem firebase CLI-Tool zu tun:

$ 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

Ein kleiner Hinweis ist, dass das Zugriffstoken leer ist (ich habe das gleiche Problem, ich habe das JWT entschlüsselt).

Es impliziert aus seiner Form
xxxx.x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Das mittlere x ist die Datennutzlast und hat eine Größe von 1 Zeichen, ist also eindeutig nicht sehr voll.

firebase-tools verwendet google-auto-auth, um Token zu erhalten, daher denke ich, dass das Problem dort liegen könnte.

Hoppla, die neue Version ( 3.18.6 ) scheint authScopes immer noch nicht an autoAuth() . Wenn ich vor dieser Zeile eine Log-Anweisung hinzufüge: https://github.com/firebase/firebase-tools/blob/b2594467d8980c5a1e2b8c4aff3de9877a98b42b/lib/requireAuth.js#L21
Ich bekomme authScopes: undefined .

Wenn ich hinzufüge

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

vor dieser Zeile, dann ruft es ein Zugriffstoken ab, schlägt jedoch mit PROJECT_NOT_FOUND fehl

Auch @tomlarkworthy , dass OAuth-Token kein JWT ist, also sollte es nicht den mittleren Teil enthalten. Wenn Sie es in https://developers.google.com/apis-explorer/#search/oauth2/oauth2/v2/oauth2.tokeninfo ausführen, wird es als gültiges Token mit "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",

Vielen Dank! OK Also, wenn ich den Fehler Projekt nicht gefunden bekomme. Wenn ich das Token entschlüssele, habe ich nur einen einzigen Bereich " https://www.googleapis.com/auth/cloud-platform ".

Es gibt einen Unterschied zwischen einem "normalen" Token (dh einem, der über 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"
}

und eines, das aus einem Dienstkonto (SA) generiert wurde:

{
 "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"
}

Es scheint also, dass das Token nicht auf das richtige audience und user_id , das der von https://github.com/firebase/firebase-tools/blob/376678fef91f71de5859f14d8374b2d8d2731980/ sein sollte. lib/api.js#L84

@tomlarkworthy immer noch seltsam, mein authScope ist undefined sei denn, ich füge explizit die richtigen Bereiche hinzu. Haben Sie firebase logout bevor Sie dieses ausgeführt haben?

OK, dass die Client-ID der oath2-Client ist, der sehr spezifische Domänen hat, die außerhalb unserer Reichweite konfiguriert werden können. Und/oder erfordert eine Benutzerinteraktion auf localhost. Das ist also sehr schwer, eine Autorisierung in CI zu erhalten.

Ich führe meine auf einer Funktion aus. Ich hatte nicht den gleichen Fehler wie du. Ich habe Projekt nicht wie das Originalplakat gefunden.

Wenn ich mein eigenes Token aus dem Dienstkonto konstruiere und es mit --token übergebe, erhalte ich :-

HTTP-ANTWORT 401varie=X-Origin, Origin,Accept-Encoding, www-authenticate=Bearer realm=" https://accounts.google.com/ ", content-type=application/json; charset=UTF-8, date=Do, 07.06.2018 00:16:43 GMT, abgelaufen=Do, 07.06.2018 00:16:43 GMT, cache-control=private, max-age=0, x-content- type-options=nosniff, x-frame-options=SAMEORIGIN, x-xss-protection=1; mode=blockieren, server=GSE, alt-svc=quic=":443"; ma=2592000; v="43,42,41,39,35", accept-ranges=none, connection=close
[2018-06-07T00:16:43.786Z] <<< HTTP RESPONSE BODY error=unauthorized_client, error_description=Unauthorized
[2018-06-07T00:16:43.791Z] > Befehl erfordert Bereiche: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www .googleapis.com/auth/firebase"]
[2018-06-07T00:16:43.792Z] > Autorisierung über Option --token
[2018-06-07T00:16:43.792Z] > Zugriffstoken mit Bereichen aktualisieren: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https:/ /www.googleapis.com/auth/firebase"]
[2018-06-07T00:16:43.793Z] >>> HTTP REQUEST POST 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',
Umfang: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase ' }

Ich denke, diese Eid-Client-ID steht im Weg?

@tomlarkworthy nicht unbedingt schwer - ich clientId .

Ich habe versucht, ein benutzerdefiniertes Projekt mit einem eigenen Oauth-Client zu erstellen und die Firebase-Tools client_id und secret_id zu überschreiben. Dann habe ich die Oath-Webanwendung autheorisiert, das Token kopiert und zum Aufrufen von Firebase-Tools verwendet. Es geht einen etwas anderen Weg und aktualisiert das Token erfolgreich, kann dann jedoch die Liste der Projekte nicht abrufen. Ich habe im Token-Decoder bestätigt, dass er den schreibgeschützten Bereich von cloudplatformprojects hatte, sodass er sie hätte lesen können sollen.

info: stderr: [2018-06-07T01:02:21.126Z] Umgebungsüberschreibungen: FIREBASE_CLIENT_ID, FIREBASE_CLIENT_SECRET
[2018-06-07T01:02:21.126Z] -------------------------------------- --------------------------------

info: stderr: [2018-06-07T01:02:21.138Z] > Befehl erfordert Bereiche: ["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] > Autorisierung über Option --token
[2018-06-07T01:02:21.140Z] > Zugriffstoken mit Bereichen aktualisieren: ["email","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 REQUEST POST 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',
Umfang: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/cloud-platform ' }
Mi 06.06.2018 18:02:21 GMT-0700 (PDT)

info: stderr: [2018-06-07T01:02:21.318Z] <<< HTTP RESPONSE 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=Mo, 01 Jan 1990 00:00:00 GMT, date=Do, 07 Jun 2018 01:02:21 GMT,varie=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,restricted-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,restricted-shared-layer2-grpc-aggregate, accept-ranges= keine, Verbindung=schließen

info: stderr: [2018-06-07T01:02:21.319Z] >>> HTTP REQUEST GET https://admin.firebase.com/v1/projects/docsite-go

Mi 06.06.2018 18:02:21 GMT-0700 (PDT)

info: stderr: [2018-06-07T01:02:21.652Z] <<< HTTP RESPONSE 404 server=nginx, date=Do, 07.06.2018 01:02:21 GMT, content-type=application/json; charset=utf-8, content-length=87, connection=close, x-content-type-options=nosniff

info: stderr: [2018-06-07T01:02:21.652Z] <<< HTTP RESPONSE BODY code=PROJECT_NOT_FOUND, message=Das angegebene Projekt wurde nicht gefunden.

@tomlarkworthy Das Überschreiben von client_id und secret mit benutzerdefinierten Werten funktioniert nicht, da Firebase derzeit einen vordefinierten Client verwendet, der von allen Kundenprojekten getrennt ist (zumindest ist das mein Verständnis).

Darüber hinaus unterstützt die Option --token nur Aktualisierungstoken, die Sie nicht erhalten, wenn Sie ein Dienstkonto haben (wiederum, soweit ich es verstanden habe).

Wir müssen nach Möglichkeit einen einfachen Weg finden, um das SA-Zugriffstoken mit dieser Client-ID zu generieren.

Es ist möglicherweise möglich, einen alternativen Weg zu gehen und Firebase-APIs mit einem Client-JWT anstelle eines OAuth-Tokens aufzurufen, wie hier beschrieben: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt -auth

google/google-auth-library-nodejs , das intern von stephenplusplus/google-auto-auth verwendet wird , bietet hierfür eine bequemere/sicherere Methode.

Ich glaube nicht, dass wir Fortschritte machen können.

https://github.com/firebase/firebase-tools/issues/647#issuecomment -361926336 scheint zuvor über einen Erfolg gemeldet zu haben, ist sich jedoch nicht sicher, ob dies bestätigt ist. Anscheinend ist die fragliche Firebase-API (https://admin.firebase.com/v1/projects) privat und akzeptiert nur Token, die für diese Client-ID generiert wurden.

Vielleicht sollte dies als Funktionsanfrage eingereicht werden. Die Möglichkeit, ein Dienstkonto für die Bereitstellung zu verwenden, würde es ermöglichen, sowohl Firebase- als auch GCP-Ressourcen mit einer einzigen Anmeldeinformation (und von jedem Benutzer getrennt) bereitzustellen.

Die Option --token in der CLI soll ein Aktualisierungstoken übergeben werden , kein Zugriffstoken. Es ist dasjenige, das aus firebase login:ci generiert wird.

Ich habe die Autorisierung des Dienstkontos nicht ausführlich getestet, vermute jedoch, dass im admin.firebase.com Back-End möglicherweise eine umfassende IAM-Prüfung stattfindet, die eine umfassende Berechtigung erfordert. Wir können weiter untersuchen, aber ich würde hier nicht unbedingt eine superschnelle Auflösung erwarten.

Der Option --token in der CLI soll ein Aktualisierungstoken übergeben werden

Ja, wie oben beschrieben verstanden.

Es wäre erstaunlich, einen SA-Schlüssel für die Bereitstellung aus CI-Umgebungen zu verwenden. Das Aktualisierungstoken ist an einen bestimmten Nutzer gebunden und es ist nicht klar, wie es verwendet wird, um gcloud Befehle zur Verwaltung anderer GCP-Dienste zu authentifizieren. Derzeit müssen wir beide Arten von Anmeldeinformationen bereitstellen (das Aktualisierungstoken des Administratorbenutzers für die Firebase-CLI und einen SA-Schlüssel für gcloud ).

Ich kann FIREBASE_TOKEN='<token_here>' firebase deploy --only firestore,storage (ich habe keine anderen Ziele ausprobiert, es ist möglich, dass sie funktionieren) mit einem für ein Dienstkonto generierten Token.

Das eigentliche Token wurde für ein Dienstkonto von der GCP-Secrets-Engine von https://www.googleapis.com/auth/cloud-platform " generiert.

Ich bestätige, dass es nicht möglich ist, einen SA-Schlüssel + GOOGLE_APPLICATION_CREDENTIALS zu verwenden, mit der neuesten Firebase-Cli, alle Befehle beenden mit:

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 das ist interessant, wissen Sie, wie Tresor Oauth-Token für das Dienstkonto generiert?

@paolomainardi firebase list funktioniert nicht mit einem SA-Schlüssel, da dies von einer älteren Implementierung der Projektauflistung abhängt. Aber so ziemlich alles andere sollte (obwohl Sie möglicherweise zuerst ein paar APIs aktivieren müssen). Ich würde empfehlen, einen anderen Befehl auszuprobieren und zu sehen.

Wir arbeiten daran, volle Unterstützung für GOOGLE_APPLICATION_CREDENTIALS ohne durch eine Reihe von Reifen zu springen, weil wir denken, dass es einige großartige Anwendungsfälle freischaltet.

@paolomainardi Ich denke, die Implementierung von vault ist hier (das ist nur eine Vermutung nach einer kurzen Suche durch den Code).

Ich denke auch gcloud alpha iam service-accounts sign-jwt dasselbe tut (wiederum eine etwas fundierte Vermutung).

Vielen Dank @cpick , ich halte euch auf dem

Ich habe mir das kurz angesehen und als Test versucht, die Anmeldeinformationen eines Dienstkontos und ein access_token in requireAuth.js zu
in dem Versuch, zumindest zu sehen, dass etwas funktioniert.

Es scheint, dass die cli immer versucht, https://admin.firebase.com/v1/projects/ zu kontaktieren, egal was passiert (Sie können was ich meine mit dem --debug Flag. Wenn ich in den vorherigen Kommentar in dieser Ausgabe lese, ist es vielleicht das "Vermächtnis". ' API-Endpunkt, der nicht mit svc-Konten funktioniert.

Ich habe einige andere Endpunkte mit einfachen GET Aufrufen getestet und sie scheinen in Ordnung zu sein:

für ref


  • Hartcodierte Änderung, die ich an requireAuth.js nur zum Testen, die ein svc_accounts-Zugriffstoken mit weiten Bereichen zurückgibt
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");
 ......

  • Allgemeiner Kunde
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);
    }); 

Ich kann endlich mit einem Dienstkonto für firestore , storage und hosting bereitstellen, nachdem requireAuth.js vorgenommen habe, wie in dieser Zusammenfassung gezeigt
ADC, der schon da war..>

Das Folgende ist im Grunde ein Hack und unvollständig, da es nicht mit der Bereitstellung von functions funktioniert. Es lohnt sich, auf die oben von mbleigh erwähnte vollständige Lösung für "erstklassigen Support" zu warten.


Jedenfalls habe ich es wie folgt verifiziert:

Beginnen Sie mit einem Firebase-Konto, das auch im Kontext mit gcloud

  1. Holen Sie sich einen privaten Schlüssel für ein Dienstkonto
$ 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. Fügen Sie das Dienstkonto als OWNER zu diesem Projekt hinzu

  2. Gehen Sie zur Cloud-Konsole und aktivieren Sie einige APIs:

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. Lokale Anmeldeinformationen entfernen

Sowohl für gcloud als auch für firebase

$ firebase logout
✔  Logged out from [email protected]

$ mv ~/.config/gcloud ~/.config/gcloud_backup
  1. ADC env-var setzen und bereitstellen
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. Bereitstellung überprüfen

deployment_hosting

  1. Versuchen Sie die Bereitstellung von functions

functions Bereitstellungstypen funktionieren nicht, selbst wenn ich versucht habe, die folgenden Aktivierungsprüfungen zu überschreiben (sie wird beim Zugriff auf einen anderen mobilesdk.googleapis.com Endpunkt angehalten. Möglicherweise sind die Bereitstellungen der Firebase-Funktionen an die client_id gebunden

$ 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"

Interne Fehlerreferenz: 122552119

Gibt es Updates zu diesem Thema @tinaliang ? Ich denke, dass die Unterstützung von Dienstkonten für die Authentifizierung hohe Priorität haben sollte.

Zur Zeit kein Update...

Meine Erkenntnis aus den letzten Tagen ist, dass ich keine speziellen Firebase Cloud-Funktionen benötige, damit ich GCP Cloud-Funktionen https://cloud.google.com/functions/ verwenden kann, die wie erwartet funktionieren (Bereitstellung erfolgt über die gcloud-CLI). ist nicht der wirkliche Workaround ... aber es könnte für jemanden hilfreich sein :)

Dupliziert von #1175

Gibt es schon Updates? Ich habe versucht, meine Firebase-App über Cloud Build bereitzustellen. hosting usw. scheint zu funktionieren und richtig bereitzustellen. functions würde nicht korrekt bereitgestellt und ich erhalte 404 , wie oben beschrieben, mit der richtigen Konfiguration in IAM. (Das Dienstkonto cloudbuild hat Rechte auf "Firebase Admin" und "API Keys Admin".) Dieses Ticket sollte hohe Priorität haben 🔥

Es gibt noch keine Updates, aber wir hoffen, dass wir bald einen Blick darauf werfen.

@mbleigh ein Update? Bestätigen Sie, dass die Firebase-CLI ab sofort kein Dienstkonto zum Bereitstellen verwenden kann? wir wollen es für CI-Tool. funktioniert der GOOGLE_APPLICATION_CREDENTIALS-Support nicht?

Wie bereits erwähnt, funktionieren nicht alle firebase CLI-Befehle mit GOOGLE_APPLICATION_CREDENTIALS , aber eine gute Anzahl sollte es. Das Festlegen des Pfads Ihrer Dienstkonto-Anmeldeinformationen sollte alles sein, was Sie tun müssen (tatsächlich macht das unter anderem das Skript test-hosting.sh ).

Mit firebase login:ci sollten Sie in der Lage sein, einen Token in Ihrem CI-System zu verwenden

Die Verwendung und Möglichkeiten von GOOGLE_APPLICATION_CREDENTIALS zu formalisieren ist in unserem Kopf, aber wir können uns nicht auf einen Zeitplan dafür festlegen. Danke für Ihre Geduld.

Könnten Sie klarstellen, dass ADC für Instanzmetadaten in diesem Fall funktionieren würde oder nur GOOGLE_APPLICATION_CREDENTIALS ?

Jeder in diesem Thread: Wenn Sie abenteuerlustig sind, würde ich gerne den Branch auf # 1463 ausprobieren und sehen, ob Sie damit die Dinge tun können, die Sie mit der Dienstkonto-Authentifizierung tun möchten. Ich denke, wir haben vielleicht die meisten Probleme gelöst, aber ich würde gerne einige externe Tests davon durchführen.

@mbleigh firebase apps:list web schlägt in Cloud Build die Hälfte der Zeit zeitweise fehl. Das Ausführen mit Debug gibt uns keine Informationen über die Fehlerursache. Irgendwelche Gedanken, was der Fall sein könnte?

[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] ----------------------------------------------------------------------

Außerdem schlägt der Befehl firebase use projectName zeitweise fehl, weil er nicht die richtigen Anmeldeinformationen vom Metadatenserver abrufen kann:

[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)

Ab dem 02.10.20 habe ich zeitweilige Fehler festgestellt, wenn ich Cloudbuild zur Bereitstellung auf dem Firebase-Hosting verwendet habe, wenn ein Dienstkonto verwendet wird. Davor war es eine Zeit lang durchgehend in Ordnung und jetzt scheint es häufiger zu scheitern. Ich frage mich langsam, ob es einen neuen Satz von Berechtigungen gibt, die ich an das Dienstkonto delegieren muss, damit es dies erfolgreich tun kann. Es ist ein kleines Problem geworden, da die meisten meiner Bereitstellungen einfach fehlschlagen 😞

Unten ist ein Screenshot mit einem Beispiel für die Builds und wann sie plötzlich fehlgeschlagen sind:

image

Der Debug-Fehler ist dem obigen Kommentar sehr ähnlich:

[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.

Dies scheint mit https://github.com/firebase/firebase-tools/issues/1970 zusammenzuhängen (nämlich der Einstellung der alten v1beta1 Instanz-Metadaten-Endpunkte, die immer noch von der alten gcloud Auth verwendet werden Bibliothek, die von Firebase CLI verwendet wird.)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen