Firebase-tools: Erro de autenticação ADC: escopos são necessários para esta solicitação

Criado em 29 mai. 2018  ·  46Comentários  ·  Fonte: firebase/firebase-tools

Oi, estou tentando automatizar a implantação de funções do Firebase. Quando executo algo como “GOOGLE_APPLICATION_CREDENTIALS =firebase use--non-Interactive --debug ”Tenho o seguinte erro abaixo

Informação da versão

3,18,5

Informação de plataforma

nó do contêiner

Passos para reproduzir

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

Comportamento esperado

Para ser autenticado

Comportamento real

[2018-05-29T15: 57: 32.507Z]> comando requer escopos: [“email”, “openid”, “https://www.googleapis.com/auth/cloudplatformprojects.readonly“, ”https: // www .googleapis.com / auth / firebase ”]
[2018-05-29T15: 57: 32.507Z]> tentativa de autenticação por meio de credenciais padrão do aplicativo
[2018-05-29T15: 57: 32.547Z]! erro de auto-autenticação: escopos são necessários para esta solicitação.
[2018-05-29T15: 57: 32.547Z]> nenhuma credencial foi encontrada ou recuperada automaticamente

Você tem algumas sugestões?

Comentários muito úteis

@mbleigh alguma atualização? confirmando que a partir de agora o Firebase CLI não pode usar uma conta de serviço para implantar? queremos isso para a ferramenta de CI. então o suporte do GOOGLE_APPLICATION_CREDENTIALS não funciona?

Todos 46 comentários

Olá, as credenciais exigidas não são GOOGLE_APPLICATION_CREDENTIALS, então essa linha não ajuda você.

Você precisará gerar um token de CI e, em seguida, executar o comando com o sinalizador --token, consulte https://github.com/firebase/firebase-tools#using -with-ci-systems para obter mais informações.

Oi,
e quanto a https://github.com/firebase/firebase-tools/pull/417 ?
Parece que GOOGLE_APPLICATION_CREDENTIALS está implementado e firebase-tools usa google-auto-auth para obtê-lo.

Ou eu estou errado?

Eu não usaria o token CI porque gostaria de me autenticar com uma conta de serviço e não um usuário do Google (GSuite ou Cloud Identity ou qualquer outro)

Obrigado

Oi,
parece que a biblioteca faz uma chamada para firebase-public.firebaseio. com: 443 e tem um código de retorno HTTP de 200, mas uma resposta de 0 bytes

Oi você está certo. Desculpe, esqueci aquele PR. Não estou muito familiarizado com isso. Michael, você pode dar uma olhada quando estiver de volta ao escritório?

Olá @laurenzlong @mbleigh ,
Descobri que configurar "Autoridade em todo o domínio" para a conta de serviço permite a autenticação.
Mas agora tenho o seguinte 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.

A conta de serviço tem permissões de Editor no projeto e se eu usar uma identidade do Google (não uma conta svc), o problema não existe

Encontrei esse problema semelhante (mas eles usam token) https://github.com/firebase/firebase-tools/issues/744

Obrigado

Não, estou errado.
Se eu executar o firebase, uso novamente:

[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

Mesmo comportamento, mesmo com uma conta de serviço com a função Owner atribuída tentando fazer qualquer coisa usando a ferramenta 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

Uma pequena dica é que o token de acesso está vazio (tenho o mesmo problema, decodifiquei o JWT)

Está implícito em sua forma
xxxx.x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxx

O x do meio é a carga útil de dados e tem 1 caractere, portanto, claramente não é muito completo.

firebase-tools usa google-auto-auth para obter o token, então acho que o problema pode estar aí.

Opa, a nova versão ( 3.18.6 ) ainda não parece passar authScopes para autoAuth() . Se eu adicionar uma instrução de log antes desta linha: https://github.com/firebase/firebase-tools/blob/b2594467d8980c5a1e2b8c4aff3de9877a98b42b/lib/requireAuth.js#L21
Eu recebo authScopes: undefined .

Se eu adicionar

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

antes dessa linha, ele passa a adquirir um token de acesso, mas falha com PROJECT_NOT_FOUND

Além disso , https://developers.google.com/apis-explorer/#search/oauth2/oauth2/v2/oauth2.tokeninfo , ele relatará como um token válido com "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",

Obrigado! OK Então, quando eu obtiver o erro de projeto não encontrado. Quando decodifico o token, tenho apenas um único escopo " https://www.googleapis.com/auth/cloud-platform ".

uma diferença entre um símbolo (um ou seja adquirida através de "normal" 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"
}

e um gerado a partir de uma conta de serviço (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"
}

Portanto, parece que o token não foi emitido para audience e user_id corretos, que deveria ser o de https://github.com/firebase/firebase-tools/blob/376678fef91f71de5859f14d8374b2d8d2731980/ lib / api.js # L84

@tomlarkworthy ainda estranho, meu authScope é undefined menos que eu explicitamente adicionar os escopos corretos. Você firebase logout antes de executar este?

OK, esse ID de cliente é o cliente oath2, que tem domínios muito específicos que podem funcionar configurados fora do nosso alcance. E / ou requer interação do usuário no localhost. Portanto, é muito difícil obter autorização no CI.

Estou executando o meu em uma função. Não tive o mesmo erro que você. Eu tenho um projeto não encontrado como o pôster original.

Se eu construir meu próprio token a partir da conta de serviço e passá-lo com --token, obtenho: -

RESPOSTA HTTP 401 variar = X-Origin, Origin, Accept-Encoding, www-authenticate = Bearer realm = " https://accounts.google.com/ ", content-type = application / json; charset = UTF-8, data = Thu, 07 Jun 2018 00:16:43 GMT, expira = Thu, 07 Jun 2018 00:16:43 GMT, cache-control = private, max-age = 0, x-content- opções de tipo = nosniff, opções de x-frame = SAMEORIGIN, x-xss-proteção = 1; modo = bloco, servidor = GSE, alt-svc = quic = ": 443"; ma = 2592000; v = "43,42,41,39,35", faixas de aceitação = nenhum, conexão = fechar
[2018-06-07T00: 16: 43.786Z] <<< HTTP RESPONSE BODY error = unauthorized_client, error_description = Não autorizado
[2018-06-07T00: 16: 43.791Z]> comando requer escopos: ["email", "openid", "https://www.googleapis.com/auth/cloudplatformprojects.readonly", "https: // www .googleapis.com / auth / firebase "]
[2018-06-07T00: 16: 43.792Z]> autorizando por meio da opção --token
[2018-06-07T00: 16: 43.792Z]> atualizando o token de acesso com escopos: ["email", "openid", "https://www.googleapis.com/auth/cloudplatformprojects.readonly", "https: / /www.googleapis.com/auth/firebase "]
[2018-06-07T00: 16: 43.793Z] >>> POST DE PEDIDO DE 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',
escopo: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase '}

Eu acho que esse id de cliente de juramento está atrapalhando?

@tomlarkworthy não necessariamente difícil - estou testando a configuração com clientId agora.

Tentei criar um projeto personalizado com seu próprio cliente oauth e substituir o firebase-tools client_id e secret_id. Então, eu autheorizei o aplicativo web de juramento, copiei o token e usei-o para invocar firebase-tools. Ele segue um caminho ligeiramente diferente e atualiza o token com êxito, mas falha em obter a lista de projetos. Confirmei no decodificador de token que ele tinha o escopo somente leitura da cloudplatformprojects, então deveria ser capaz de lê-los.

info: stderr: [2018-06-07T01: 02: 21.126Z] Substituições de ambiente: FIREBASE_CLIENT_ID, FIREBASE_CLIENT_SECRET
[2018-06-07T01: 02: 21.126Z] -------------------------------------- --------------------------------

info: stderr: [2018-06-07T01: 02: 21.138Z]> o comando requer escopos: ["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 por meio da opção --token
[2018-06-07T01: 02: 21.140Z]> atualizando o token de acesso com escopos: ["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 PEDIDO DE 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',
escopo: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/cloud-platform '}
Quarta, 06 de junho de 2018 18:02:21 GMT-0700 (PDT)

info: stderr: [2018-06-07T01: 02: 21.318Z] <<< RESPOSTA 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, data = Thu, 07 Jun 2018 01:02:21 GMT, Varia = 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 = nenhum, conexão = fechar

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

Quarta, 06 de junho de 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, 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 = O projeto especificado não foi encontrado.

@tomlarkworthy substituir client_id e secret com valores personalizados não funcionará, porque o Firebase atualmente usa um cliente predefinido que é separado de qualquer projeto de cliente (pelo menos é o que eu entendo).

Além disso, a opção --token só oferece suporte a token de atualização, que você não obtém se tiver uma conta de serviço (mais uma vez, pelo que entendi).

Precisamos encontrar uma maneira simples de gerar o token de acesso SA com esse ID de cliente, se possível.

Pode ser possível seguir uma rota alternativa e chamar as APIs do Firebase com um cliente JWT em vez do token OAuth, conforme descrito aqui: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt -auth

google / google-auth-library-nodejs , que é usado internamente por stephenplusplus / google-auto-auth , fornece um método mais conveniente / seguro para fazer isso.

Não acho que possamos fazer progressos.

https://github.com/firebase/firebase-tools/issues/647#issuecomment -361926336 parece ter relatado sucesso anteriormente, embora não tenha certeza se isso foi confirmado. Parece que a API Firebase em questão (https://admin.firebase.com/v1/projects) é privada e só aceita tokens gerados para esse ID de cliente.

Talvez isso deva ser arquivado como uma solicitação de recurso - ter a capacidade de usar uma conta de serviço para implantação permitiria o uso de uma única credencial (e desacoplada de qualquer usuário) para implantar recursos do Firebase e do GCP.

A opção --token na CLI deve receber um token de atualização , não um token de acesso. É aquele que é gerado a partir de firebase login:ci .

Não testei extensivamente a autorização da conta de serviço, mas suspeito que pode haver uma verificação de IAM que requer permissão ampla acontecendo no back-end admin.firebase.com . Podemos investigar mais, mas não esperaria necessariamente uma resolução super-rápida aqui.

A opção --token na CLI deve receber um token de atualização

Sim, entendido como mencionado acima.

Seria incrível usar uma chave SA para implantar em ambientes de CI. O token de atualização está vinculado a um usuário específico e não está claro como usá-lo para autenticar comandos gcloud para administrar outros serviços do GCP. Atualmente, temos que fornecer os dois tipos de credenciais (token de atualização do usuário administrador para Firebase CLI e uma chave SA para gcloud ).

Consigo FIREBASE_TOKEN='<token_here>' firebase deploy --only firestore,storage (não tentei outros alvos, é possível que funcionem) usando um token gerado para uma conta de serviço.

O token real foi gerado para uma conta de serviço pelo mecanismo de segredos GCP do Vault com o escopo " https://www.googleapis.com/auth/cloud-platform ".

Confirmo que é impossível usar uma chave SA + GOOGLE_APPLICATION_CREDENTIALS, com o Firebase CLI mais recente, qualquer comando sai com:

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 isso é interessante, você sabe como o vault gera tokens oauth para a conta de serviço?

@paolomainardi firebase list não funcionará com uma chave SA porque depende de uma implementação de lista de projeto legado. No entanto, quase todo o resto deveria (embora você possa precisar habilitar algumas APIs primeiro). Eu recomendo tentar outro comando e ver.

Estamos trabalhando para obter suporte total para GOOGLE_APPLICATION_CREDENTIALS sem passar por muitos obstáculos porque achamos que isso desbloqueia alguns casos de uso excelentes.

@paolomainardi Acho que a implementação de vault está aqui (isso é apenas um palpite após uma rápida pesquisa em seu código).

Eu também acho que é a mesma coisa que gcloud alpha iam service-accounts sign-jwt faz (novamente, um palpite um pouco educado).

Muito obrigado @cpick , vou mantê-lo informado.

Dei uma olhada rápida nisso e, como teste, tentei forçar as credenciais de uma conta de serviço e access_token em requireAuth.js
em uma tentativa de pelo menos ver algo funcionar.

Parece que o CLI sempre tenta entrar em contato com https://admin.firebase.com/v1/projects/ não importa o que (você pode o que quero dizer com a sinalização --debug . Se eu ler o comentário anterior nesta edição, talvez seja o 'legado 'api endpoint que não' funciona com contas svc.

Eu testei alguns outros endpoints com chamadas de GET simples e eles parecem estar ok:

para ref


  • Modificação codificada que fiz em requireAuth.js apenas para teste que retornará um token de acesso svc_accounts com escopos amplos
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);
    }); 

Posso implantar finalmente usando uma conta de serviço em firestore , storage e hosting depois de fazer uma edição em requireAuth.js como mostrado nesta essência
ADC que já estava lá ..>

O seguinte é basicamente um hack e incompleto porque não funciona com implantação de functions . Vale a pena esperar pela solução completa mencionada por mbleigh acima para 'suporte de primeira classe'.


De qualquer forma, eu verifiquei da seguinte forma:

Comece com uma conta Firebase que também esteja no contexto w / gcloud

  1. Obtenha uma chave privada de conta de serviço
$ 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. Adicione a conta de serviço como OWNER nesse projeto

  2. Vá para o console da nuvem e habilite algumas 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. Remover credenciais locais

Para gcloud e firebase

$ firebase logout
✔  Logged out from [email protected]

$ mv ~/.config/gcloud ~/.config/gcloud_backup
  1. Defina ADC env-var e implante
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 implantação

deployment_hosting

  1. Tentativa de implantação functions

functions tipos de implantação mobilesdk.googleapis.com . Talvez as implantações de funções do firebase estejam ligadas ao client_id para funções firebase ou de alguma forma requer 3LO .... mas isso é tudo conjectura

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

Referência de bug interno: 122552119

Há alguma atualização sobre esse problema @tinaliang ? Acho que o suporte de conta de serviço para autenticação deve ser de alta prioridade.

Nenhuma atualização neste momento ...

Minha descoberta dos últimos dias é que não preciso especificamente das funções do Firebase Cloud, então posso usar as funções do GCP Cloud https://cloud.google.com/functions/ que funcionam conforme o esperado (a implantação é feita por meio da CLI do gcloud). não é a verdadeira solução alternativa ... mas pode ser útil para alguém :)

Duplicado por # 1175

Já existem atualizações? Tentei implantar meu aplicativo Firebase via Cloud Build. hosting etc. parece funcionar e implantar corretamente. functions não implantaria corretamente e recebo 404 , conforme descrito acima, com a configuração adequada no IAM. (A conta de serviço cloudbuild tem direitos para "Firebase Admin" e "API Keys Admin".) Este tíquete deve ter alta prioridade 🔥

Ainda não há atualizações, mas esperamos dar uma olhada em breve.

@mbleigh alguma atualização? confirmando que a partir de agora o Firebase CLI não pode usar uma conta de serviço para implantar? queremos isso para a ferramenta de CI. então o suporte do GOOGLE_APPLICATION_CREDENTIALS não funciona?

Como mencionado antes, nem todos os comandos firebase CLI funcionarão com GOOGLE_APPLICATION_CREDENTIALS , mas um bom número deveria. Configurá-lo para o caminho das credenciais da sua conta de serviço deve ser tudo o que você precisa fazer (na verdade, é isso que o script test-hosting.sh faz, entre outras coisas).

Usando firebase login:ci você deve ser capaz de usar um token em seu sistema de CI

A formalização do uso e dos recursos de GOOGLE_APPLICATION_CREDENTIALS está em nossas mentes, mas não podemos nos comprometer com um cronograma para isso. Obrigado pela sua paciência.

Você poderia esclarecer - o ADC de metadados de instância funcionaria neste caso, ou apenas GOOGLE_APPLICATION_CREDENTIALS ?

Alguém neste tópico: se você está se sentindo aventureiro, adoraria que você experimentasse o branch no # 1463 e ver se ele permite que você faça as coisas que deseja fazer com a autenticação da conta de serviço. Acho que podemos ter reforçado a maioria dos problemas, mas adoraria fazer alguns testes externos disso.

@mbleigh firebase apps:list web falhará intermitentemente na metade do tempo no Cloud Build. Executar com depuração não nos fornece nenhuma informação sobre o motivo da falha. Alguma ideia sobre o que poderia ser o 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] ----------------------------------------------------------------------

Além disso, o comando @mbleigh firebase use projectName também falhará intermitentemente porque não consegue obter as credenciais corretas do servidor de metadados:

[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 de 20/10/20 comecei a ver falhas intermitentes ao usar o cloudbuild para implantar no Firebase hosting ao usar uma conta de serviço. Ele tinha estado consistentemente bem por um tempo antes disso e agora parece que falha com mais frequência do que não. Estou começando a me perguntar se há um novo conjunto de permissões que preciso delegar à conta de serviço para que ela possa fazer isso com êxito. Isso se tornou um problema, pois a maioria das minhas implantações simplesmente falham 😞

Abaixo está uma captura de tela com um exemplo das compilações e quando de repente começaram a falhar:

image

O erro de depuração é muito semelhante ao comentário acima:

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

Isso parece estar relacionado a https://github.com/firebase/firebase-tools/issues/1970 (ou seja, a descontinuação dos antigos v1beta1 endpoints de metadados de instância, que ainda são usados ​​pelo antigo gcloud Auth biblioteca usada pela Firebase CLI ..)

Esta página foi útil?
0 / 5 - 0 avaliações