Firebase-tools: Error de autenticación de ADC: se requieren ámbitos para esta solicitud

Creado en 29 may. 2018  ·  46Comentarios  ·  Fuente: firebase/firebase-tools

Hola, estoy intentando automatizar la implementación de funciones de base de fuego. Cuando ejecuto algo como "GOOGLE_APPLICATION_CREDENTIALS =uso de base de fuego--non-interactive --debug ”Tengo el siguiente error a continuación

Información de la versión

3.18.5

Información de la plataforma

nodo contenedor

pasos para reproducir

/ usr / bin / docker run --rm -v / espacio de trabajo: / espacio de trabajo -e GOOGLE_APPLICATION_CREDENTIALS =nodo: 6.14-alpine node_modules / firebase-tools / bin / firebase use--depurar

Comportamiento esperado

Ser autenticado

Comportamiento real

[2018-05-29T15: 57: 32.507Z]> el comando requiere ámbitos: ["email", "openid", "https://www.googleapis.com/auth/cloudplatformprojects.readonly", "https: // www .googleapis.com / auth / firebase ”]
[2018-05-29T15: 57: 32.507Z]> intentando autenticarse a través de las credenciales predeterminadas de la aplicación
[2018-05-29T15: 57: 32.547Z]! error de autenticación automática: se requieren ámbitos para esta solicitud.
[2018-05-29T15: 57: 32.547Z]> no se pudieron encontrar ni recuperar automáticamente las credenciales

Tiene usted algunas sugerencias?

Comentario más útil

@mbleigh alguna actualización? ¿Confirma que a partir de ahora Firebase CLI no puede usar una cuenta de servicio para implementar? lo queremos para la herramienta CI. ¿Entonces el soporte de GOOGLE_APPLICATION_CREDENTIALS no funciona?

Todos 46 comentarios

Hola, las credenciales requeridas no son GOOGLE_APPLICATION_CREDENTIALS, por lo que esa línea en realidad no te ayuda.

Deberá generar un token de CI y luego ejecutar el comando con el indicador --token, consulte https://github.com/firebase/firebase-tools#using -with-ci-systems para obtener más información.

Hola,
y ¿qué hay de https://github.com/firebase/firebase-tools/pull/417 ?
Parece que GOOGLE_APPLICATION_CREDENTIALS está implementado y firebase-tools usa google-auto-auth para obtenerlo.

¿O estoy equivocado?

No usaría el token de CI porque me gustaría autenticarme con una cuenta de servicio y no con un usuario de Google (GSuite o Cloud Identity o cualquier otra cosa)

Gracias

Hola,
parece que la biblioteca realiza una llamada a firebase-public.firebaseio. com: 443 y tiene un código de retorno HTTP de 200 pero una respuesta de 0 bytes

Hola tienes razón Lo siento, me olvidé de ese PR. No estoy muy familiarizado con esto. Michael, ¿puedes echar un vistazo cuando regreses a la oficina?

Hola @laurenzlong @mbleigh ,
Descubrí que la configuración de "Autoridad de todo el dominio" para la cuenta de servicio permite la autenticación.
Pero ahora tengo el siguiente problema:

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.

La cuenta de servicio tiene permisos de editor en el proyecto, y si uso una identidad de Google (no una cuenta de servicio), el problema no existe.

Encontré este problema similar (pero usan token) https://github.com/firebase/firebase-tools/issues/744

Gracias

No, me equivoco.
Si ejecuto el uso de firebase , tengo nuevamente:

[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

El mismo comportamiento incluso con una cuenta de servicio que tiene el rol Owner asignado tratando de hacer cualquier cosa usando la herramienta 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

Una pista menor es que el token de acceso está vacío (tengo el mismo problema, decodifiqué el JWT)

Está implícito en su forma.
xxxx.x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

La x del medio es la carga útil de datos y tiene un tamaño de 1 carácter, por lo que claramente no está muy llena.

firebase-tools usa google-auto-auth para obtener el token, así que creo que el problema podría estar ahí.

Vaya, la nueva versión ( 3.18.6 ) todavía no parece pasar de authScopes a autoAuth() . Si agrego una declaración de registro antes de esta línea: https://github.com/firebase/firebase-tools/blob/b2594467d8980c5a1e2b8c4aff3de9877a98b42b/lib/requireAuth.js#L21
Recibo authScopes: undefined .

Si agrego

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

antes de esa línea, luego procede a adquirir un token de acceso, pero falla con PROJECT_NOT_FOUND

También @tomlarkworthy , ese token de OAuth no es JWT, por lo que no debería contener la parte del medio. Si lo ejecuta en https://developers.google.com/apis-explorer/#search/oauth2/oauth2/v2/oauth2.tokeninfo , informa como un token válido con "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",

¡Gracias! OK Entonces, cuando obtengo el error de proyecto no encontrado. Cuando decodifico el token, solo tengo un alcance " https://www.googleapis.com/auth/cloud-platform ".

Hay una diferencia entre un "normal" de fichas (es decir, adquirida a través de 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"
}

y uno generado a partir de una cuenta de servicio (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"
}

Por lo tanto, parece que el token no se emite a la derecha audience y user_id , que debería ser el de https://github.com/firebase/firebase-tools/blob/376678fef91f71de5859f14d8374b2d8d2731980/ lib / api.js # L84

@tomlarkworthy sigue siendo extraño, mi authScope es undefined menos que agregue explícitamente los ámbitos correctos. ¿Hiciste firebase logout antes de ejecutar este?

OK, ese ID de cliente es el cliente oath2, que tiene dominios muy específicos que puede funcionar configurados fuera de nuestro alcance. Y / o requiere la interacción del usuario en localhost. Así que es muy difícil obtener autorización en CI.

Estoy ejecutando el mío en una función. No tuve el mismo error que tú. Tengo un proyecto que no se encuentra como el póster original.

Si construyo mi propio token desde la cuenta de servicio y lo paso con --token, obtengo: -

RESPUESTA HTTP 401 varía = 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; modo = bloque, servidor = GSE, alt-svc = quic = ": 443"; ma = 2592000; v = "43, 42, 41, 39, 35", aceptar rangos = ninguno, conexión = cerrar
[2018-06-07T00: 16: 43.786Z] <<< HTTP RESPONSE BODY error = unuthorized_client, error_description = No autorizado
[2018-06-07T00: 16: 43.791Z]> el comando requiere ámbitos: ["email", "openid", "https://www.googleapis.com/auth/cloudplatformprojects.readonly", "https: // www .googleapis.com / auth / firebase "]
[2018-06-07T00: 16: 43.792Z]> autorización mediante la opción --token
[2018-06-07T00: 16: 43.792Z]> actualización del token de acceso con alcances: ["email", "openid", "https://www.googleapis.com/auth/cloudplatformprojects.readonly", "https: / /www.googleapis.com/auth/firebase "]
[2018-06-07T00: 16: 43.793Z] >>> POST DE SOLICITUD 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',
alcance: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase '}

Creo que esta identificación de cliente de juramento se interpone en el camino.

@tomlarkworthy no es necesariamente difícil: ahora estoy probando la configuración con clientId .

Intenté crear un proyecto personalizado con su propio cliente oauth y anular el client_id y secret_id de firebase-tools. Entonces autheorized la aplicación web juramento, copiado el token y lo utilizó para invocar base de fuego-herramientas. Sigue un camino ligeramente diferente y actualiza correctamente el token, pero luego no obtiene la lista de proyectos. Confirmé en el decodificador de tokens que tenía el alcance de solo lectura de cloudplatformprojects, por lo que debería haber podido leerlos.

información: stderr: [2018-06-07T01: 02: 21.126Z] Anulaciones de entorno: FIREBASE_CLIENT_ID, FIREBASE_CLIENT_SECRET
[2018-06-07T01: 02: 21.126Z] -------------------------------------- --------------------------------

info: stderr: [2018-06-07T01: 02: 21.138Z]> el comando requiere ámbitos: ["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]> autorizando a través de la opción --token
[2018-06-07T01: 02: 21.140Z]> actualización del token de acceso con alcances: ["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] >>> POST DE SOLICITUD 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',
alcance: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/cloud-platform '}
Mié 06 de junio de 2018 18:02:21 GMT-0700 (PDT)

info: stderr: [2018-06-07T01: 02: 21.318Z] <<< RESPUESTA 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 Jan 1990 00:00:00 GMT, fecha = jueves, 07 de junio de 2018 01:02:21 GMT, variar = 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, restringido-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, restriction-shared-layer2-grpc-aggregate, accept-rangos = ninguno, conexión = cerrar

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

Mié 06 de junio de 2018 18:02:21 GMT-0700 (PDT)

información: 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, 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 = No se encontró el proyecto especificado.

@tomlarkworthy anular client_id y secret con valores personalizados no funcionará, porque Firebase actualmente usa un cliente predefinido que está separado de cualquier proyecto de cliente (al menos eso es lo que tengo entendido).

Además, la opción --token solo admite el token de actualización, que no obtienes si tienes una cuenta de servicio (nuevamente, por lo que tengo entendido).

Necesitamos encontrar una forma sencilla de generar el token de acceso de SA con este ID de cliente, si es posible.

Es posible tomar una ruta alternativa y llamar a las API de Firebase con un cliente JWT en lugar de un token OAuth, como se describe aquí: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt -auth

google / google-auth-library-nodejs , que stephenplusplus / google-auto-auth usa internamente, proporciona un método más conveniente / seguro para hacer esto.

No creo que podamos avanzar.

https://github.com/firebase/firebase-tools/issues/647#issuecomment -361926336 parece haber informado de éxito anteriormente, aunque no estoy seguro de si está confirmado. Parece que la API de Firebase en cuestión (https://admin.firebase.com/v1/projects) es privada y solo acepta tokens generados para esa ID de cliente.

Quizás esto debería presentarse como una solicitud de función: tener la capacidad de usar una cuenta de servicio para la implementación permitiría usar una sola credencial (y desvinculada de cualquier usuario) para implementar los recursos de Firebase y GCP.

La opción --token en la CLI está destinada a pasar un token de actualización , no un token de acceso. Es el que se genera a partir de firebase login:ci .

No he probado ampliamente la autorización de la cuenta de servicio, pero sospecho que puede haber una verificación de IAM que requiera un permiso amplio en el backend admin.firebase.com . Podemos investigar más, pero no esperaría necesariamente una resolución súper rápida aquí.

La opción --token en la CLI está destinada a pasar un token de actualización

Sí, entendido como se mencionó anteriormente.

Sería asombroso usar una clave SA para implementar desde entornos de CI. El token de actualización está vinculado a un usuario en particular y no está claro cómo usarlo para autenticar los comandos gcloud para administrar otros servicios de GCP. Actualmente, tenemos que proporcionar ambos tipos de credenciales (token de actualización del usuario administrador para Firebase CLI y una clave SA por gcloud ).

Puedo FIREBASE_TOKEN='<token_here>' firebase deploy --only firestore,storage (no he probado otros objetivos, es posible que funcionen) usando un token generado para una cuenta de servicio.

El token real se generó para una cuenta de servicio mediante el motor de secretos de GCP de Vault con el alcance " https://www.googleapis.com/auth/cloud-platform ".

Confirmo que es imposible usar una clave SA + GOOGLE_APPLICATION_CREDENTIALS, con la última cli de firebase, cualquier comando sale con:

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 eso es interesante, ¿sabes cómo vault genera tokens de oauth para la cuenta de servicio?

@paolomainardi firebase list no funcionará con una clave SA porque depende de una implementación de listado de proyectos heredados. Sin embargo, casi todo lo demás debería hacerlo (aunque es posible que primero deba habilitar algunas API). Recomiendo probar con otro comando y ver.

Estamos trabajando para obtener soporte completo para GOOGLE_APPLICATION_CREDENTIALS sin pasar por un montón de obstáculos porque creemos que desbloquea algunos casos de uso excelentes.

@paolomainardi Creo que la implementación vault está aquí (eso es solo una suposición después de una búsqueda rápida a través de su código).

También creo que eso es lo mismo que hace gcloud alpha iam service-accounts sign-jwt (de nuevo, una suposición un tanto informada).

Muchas gracias @cpick , te mantendré informado.

Eché un vistazo breve a esto y, como prueba, intenté forzar las credenciales de una cuenta de servicio y un access_token en requireAuth.js
en un intento de al menos ver que algo funciona.

Parece que el cli siempre intenta ponerse en contacto con https://admin.firebase.com/v1/projects/ pase lo que pase (puede decir lo que quiero decir con la bandera --debug . Si leo el comentario anterior en este número, tal vez sea el 'legado 'api endpoint que no' funciona con cuentas svc.

Probé algunos otros puntos finales con llamadas simples GET y parecen estar bien:

para ref


  • Modificación codificada que hice en requireAuth.js solo para probar que devolverá un token de acceso svc_accounts con alcances amplios
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");
 ......

  • Cliente genérico
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);
    }); 

Puedo implementar finalmente usando una cuenta de servicio en firestore , storage y hosting después de hacer una edición para requireAuth.js como se muestra en esta esencia
ADC que ya estaba allí ..>

Lo siguiente es básicamente un truco e incompleto porque no funciona con la implementación functions . Vale la pena esperar la solución completa mencionada por mbleigh anteriormente para 'soporte de primera clase'.


De todos modos, lo verifiqué de la siguiente manera:

Comience con una cuenta de base de fuego que también esté en contexto con gcloud

  1. Obtener una clave privada de la cuenta de servicio
$ 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. Agregue la cuenta de servicio como OWNER en ese proyecto

  2. Vaya a la consola en la nube y habilite algunas 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. Quitar credenciales locales

Para gcloud y firebase

$ firebase logout
✔  Logged out from [email protected]

$ mv ~/.config/gcloud ~/.config/gcloud_backup
  1. Establecer ADC env-var e implementar
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. Verificar la implementación

deployment_hosting

  1. Intente functions implementación

functions tipos de implementación de mobilesdk.googleapis.com . Tal vez las implementaciones de funciones de base de fuego estén vinculadas al client_id para funciones de base de fuego o de alguna manera requiere 3LO .... pero eso es todo una conjetura

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

Referencia de error interno: 122552119

¿Hay alguna actualización sobre este tema @tinaliang ? Creo que el soporte de la cuenta de servicio para la autenticación debería ser de alta prioridad.

No hay actualizaciones en este momento ...

Mi hallazgo de los últimos días es que no necesito específicamente funciones de Firebase Cloud, por lo que puedo usar las funciones de GCP Cloud https://cloud.google.com/functions/ que funcionan como se esperaba (la implementación se realiza a través de gcloud CLI) Sin embargo, esto no es la verdadera solución ... pero podría ser útil para alguien :)

Duplicado por # 1175

¿Hay actualizaciones todavía? Intenté implementar mi aplicación Firebase a través de Cloud Build. hosting etc. parece funcionar y desplegarse correctamente. functions no se implementaría correctamente y obtengo 404 , como se describe anteriormente, con la configuración adecuada dentro de IAM. (La cuenta de servicio cloudbuild tiene derechos para "Firebase Admin" y "API Keys Admin".) Este ticket debe tener alta prioridad 🔥

Aún no hay actualizaciones, pero esperamos echarle un vistazo pronto.

@mbleigh alguna actualización? ¿Confirma que a partir de ahora Firebase CLI no puede usar una cuenta de servicio para implementar? lo queremos para la herramienta CI. ¿Entonces el soporte de GOOGLE_APPLICATION_CREDENTIALS no funciona?

Como se mencionó anteriormente, no todos los comandos de la CLI firebase funcionarán con GOOGLE_APPLICATION_CREDENTIALS , pero un buen número debería hacerlo. Establecerlo en la ruta de las credenciales de su cuenta de servicio debería ser todo lo que necesita hacer (de hecho, eso es lo que hace el script test-hosting.sh , entre otras cosas).

Usando firebase login:ci debería poder usar un token en su sistema de CI

Formalizar el uso y las capacidades de GOOGLE_APPLICATION_CREDENTIALS está en nuestras mentes, pero no podemos comprometernos con una línea de tiempo. Gracias por su paciencia.

¿Podría aclarar si el ADC de metadatos de instancia funcionaría en este caso, o solo GOOGLE_APPLICATION_CREDENTIALS ?

Cualquiera en este hilo: si te sientes aventurero, me encantaría que pruebes la sucursal en # 1463 y veas si te permite hacer las cosas que estás buscando hacer con la autenticación de la cuenta de servicio. Creo que hayamos apuntalado la mayoría de los problemas, pero me encantaría tener algunas pruebas externas de eso.

@mbleigh firebase apps:list web fallará de forma intermitente la mitad del tiempo en Cloud Build. La ejecución con depuración no nos proporciona ninguna información sobre el motivo del error. ¿Alguna idea sobre cuál podría ser el caso?

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

Además, el comando @mbleigh firebase use projectName también fallará intermitentemente porque no puede extraer las credenciales correctas del servidor de metadatos:

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

A partir del 10/02/20, comencé a ver fallas intermitentes al usar Cloudbuild para implementar en el alojamiento de Firebase al usar una cuenta de servicio. Había estado consistentemente bien durante un tiempo antes de eso y ahora parece que falla la mayoría de las veces. Empiezo a preguntarme si hay un nuevo conjunto de permisos que necesito delegar a la cuenta de servicio para que pueda hacerlo correctamente. Se ha convertido en un problema, ya que la mayoría de mis implementaciones simplemente fallan 😞

A continuación se muestra una captura de pantalla con un ejemplo de las compilaciones y cuando de repente comenzaron a fallar:

image

El error de depuración es muy similar al comentario anterior:

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

Esto parece estar relacionado con https://github.com/firebase/firebase-tools/issues/1970 (es decir, la desaprobación de los puntos finales de metadatos de instancia v1beta1 antiguos, que todavía utilizan el antiguo gcloud Auth biblioteca utilizada por Firebase CLI ..)

¿Fue útil esta página
0 / 5 - 0 calificaciones