Firebase-tools: Kesalahan Auth ADC: Cakupan diperlukan untuk permintaan ini

Dibuat pada 29 Mei 2018  ·  46Komentar  ·  Sumber: firebase/firebase-tools

Hai, saya mencoba mengotomatiskan penerapan fungsi firebase. Ketika saya menjalankan sesuatu seperti “GOOGLE_APPLICATION_CREDENTIALS=penggunaan firebase--non-interactive --debug” Saya memiliki kesalahan berikut di bawah ini

Informasi versi

3.18.5

Informasi Platform

simpul kontainer

Langkah-langkah untuk mereproduksi

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

Perilaku yang diharapkan

Untuk diautentikasi

Perilaku sebenarnya

[2018-05-29T15:57:32.507Z] > perintah memerlukan cakupan: [“email”,“openid”,“https://www.googleapis.com/auth/cloudplatformprojects.readonly“,”https://www .googleapis.com/auth/firebase”]
[2018-05-29T15:57:32.507Z] > mencoba mengautentikasi melalui kredensial default aplikasi
[2018-05-29T15:57:32.547Z] ! kesalahan autentikasi otomatis: Cakupan diperlukan untuk permintaan ini.
[2018-05-29T15:57:32.547Z] > kredensial tidak dapat ditemukan atau diambil secara otomatis

Apakah Anda memiliki beberapa saran?

Komentar yang paling membantu

@mbleigh ada pembaruan? mengonfirmasi sampai sekarang firebase CLI tidak dapat menggunakan akun layanan untuk menyebarkan? kami menginginkannya untuk alat CI. jadi dukungan GOOGLE_APPLICATION_CREDENTIALS tidak berfungsi?

Semua 46 komentar

Hai, kredensial yang diperlukan bukan GOOGLE_APPLICATION_CREDENTIALS, jadi baris itu tidak benar-benar membantu Anda.

Anda harus membuat token CI dan kemudian menjalankan perintah dengan flag --token, lihat https://github.com/firebase/firebase-tools#using -with-ci-systems untuk info lebih lanjut.

Hai,
dan bagaimana dengan https://github.com/firebase/firebase-tools/pull/417 ?
Tampaknya GOOGLE_APPLICATION_CREDENTIALS diimplementasikan dan firebase-tools menggunakan google-auto-auth untuk mendapatkannya.

Atau aku salah?

Saya tidak akan menggunakan token CI karena saya ingin mengautentikasi dengan akun layanan dan bukan pengguna Google (GSuite atau Cloud Identity atau apa pun)

Terima kasih

Hai,
sepertinya perpustakaan membuat panggilan ke firebase-public.firebaseio. com:443 dan memiliki kode pengembalian HTTP 200 tetapi respons 0 byte

Hai, Anda benar. Maaf, saya lupa tentang PR itu. Saya tidak terlalu akrab dengan ini. Michael, bisakah kamu melihat ketika kamu kembali ke kantor?

Hai @laurenzlong @mbleigh ,
Saya telah menemukan bahwa mengonfigurasi "Otoritas Luas Domain" untuk izin akun layanan untuk mengautentikasi.
Tapi sekarang saya punya masalah berikut:

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.

Akun layanan memiliki izin Editor pada proyek, dan jika saya menggunakan identitas Google (bukan akun svc) masalahnya tidak ada

Saya telah menemukan masalah serupa ini (tetapi mereka menggunakan token) https://github.com/firebase/firebase-tools/issues/744

Terima kasih

Tidak, aku salah.
Jika saya menjalankan penggunaan firebase, saya punya lagi:

[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

Perilaku yang sama bahkan dengan akun layanan yang memiliki peran Owner ditetapkan untuk mencoba melakukan apa pun menggunakan alat CLI firebase :

$ 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

Petunjuk kecil adalah bahwa token akses kosong (saya memiliki masalah yang sama, saya memecahkan kode JWT)

Tersirat dari bentuknya
xxxx.x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

X tengah adalah payload data dan berukuran 1 karakter, jadi jelas tidak terlalu penuh.

firebase-tools menggunakan google-auto-auth untuk mendapatkan token jadi saya pikir masalahnya mungkin ada di sana.

Ups, versi baru ( 3.18.6 ) tampaknya masih belum lulus authScopes ke autoAuth() . Jika saya menambahkan pernyataan log sebelum baris ini: https://github.com/firebase/firebase-tools/blob/b2594467d8980c5a1e2b8c4aff3de9877a98b42b/lib/requireAuth.js#L21
Saya mendapatkan authScopes: undefined .

Jika saya menambahkan

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

sebelum baris itu, kemudian melanjutkan untuk mendapatkan token akses, tetapi gagal dengan PROJECT_NOT_FOUND

Juga @tomlarkworthy , token OAuth itu bukan JWT, jadi tidak boleh berisi bagian tengah. Jika Anda menjalankannya di https://developers.google.com/apis-explorer/#search/oauth2/oauth2/v2/oauth2.tokeninfo , itu dilaporkan sebagai token yang valid dengan "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",

Terima kasih! OK Jadi ketika saya mendapatkan proyek tidak ditemukan kesalahan. Ketika saya memecahkan kode token, saya hanya memiliki satu cakupan " https://www.googleapis.com/auth/cloud-platform ".

Ada perbedaan antara "normal" token (yaitu satu diperoleh melalui 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"
}

dan yang dihasilkan dari akun layanan (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"
}

Jadi tampaknya token tidak dikeluarkan di sebelah kanan audience dan user_id , yang seharusnya berasal dari https://github.com/firebase/firebase-tools/blob/376678fef91f71de5859f14d8374b2d8d2731980/ lib/api.js#L84

@tomlarkworthy masih aneh, authScope adalah undefined kecuali saya secara eksplisit menambahkan cakupan yang tepat. Apakah Anda firebase logout sebelum menjalankan yang ini?

OK bahwa ID klien adalah klien oath2, yang memiliki domain yang sangat spesifik yang dapat bekerja dikonfigurasi di luar jangkauan kami. Dan/atau memerlukan interaksi pengguna di localhost. Jadi itu sangat sulit untuk mendapatkan otorisasi di CI.

Saya menjalankan milik saya pada suatu fungsi. Saya tidak memiliki kesalahan yang sama seperti Anda. Saya memiliki proyek yang tidak ditemukan seperti poster aslinya.

Jika saya membuat token saya sendiri dari akun layanan dan meneruskannya dengan --token, saya mendapatkan:-

HTTP RESPONSE 401 bervariasi=X-Origin, Origin,Accept-Encoding, www-authenticate=Bearer realm=" https://accounts.google.com/ ", content-type=application/json; charset=UTF-8, tanggal=Kamis, 07 Jun 2018 00:16:43 GMT, kedaluwarsa=Kamis, 07 Jun 2018 00:16:43 GMT, cache-control=private, max-age=0, x-content- type-options=nosniff, x-frame-options=SAMAASAL, x-xss-protection=1; mode=blok, server=GSE, alt-svc=quic=":443"; ma=2592000; v="43,42,41,39,35", rentang-terima=tidak ada, koneksi=tutup
[2018-06-07T00:16:43.786Z] <<< HTTP RESPONSE BODY error=unauthorized_client, error_description=Unauthorized
[2018-06-07T00:16:43.791Z] > perintah memerlukan cakupan: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www .googleapis.com/auth/firebase"]
[2018-06-07T00:16:43.792Z] > otorisasi melalui --token option
[2018-06-07T00:16:43.792Z] > menyegarkan token akses dengan cakupan: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https:/ /www.googleapis.com/auth/firebase"]
[2018-06-07T00:16:43.793Z] >>> POST PERMINTAAN 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',
cakupan: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase ' }

Saya pikir id klien sumpah ini menghalangi?

@tomlarkworthy belum tentu sulit - Saya sedang menguji konfigurasi dengan clientId sekarang.

Saya mencoba membuat proyek khusus dengan klien oauth-nya sendiri dan mengganti firebase-tools client_id dan secret_id. Kemudian saya mengotorisasi aplikasi web sumpah, menyalin token dan menggunakannya untuk memanggil firebase-tools. Ini menempuh jalur yang sedikit berbeda dan berhasil menyegarkan token tetapi kemudian gagal mendapatkan daftar proyek. Saya mengkonfirmasi di token decoder itu memiliki lingkup hanya-baca cloudplatformprojects sehingga seharusnya bisa membacanya.

info: stderr: [2018-06-07T01:02:21.126Z] Env Overrides: FIREBASE_CLIENT_ID, FIREBASE_CLIENT_SECRET
[2018-06-07T01:02:21.126Z] -------------------------------------- --------------------------------

info: stderr: [2018-06-07T01:02:21.138Z] > perintah memerlukan cakupan: ["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] > otorisasi melalui --token option
[07-06-2018T01:02:21.140Z] > menyegarkan token akses dengan cakupan: ["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] >>> POSTING PERMINTAAN 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',
cakupan: 'email openid https://www.googleapis.com/auth/cloudplatformprojects.readonly https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/cloud-platform ' }
Rabu 06 Juni 2018 18:02:21 GMT-0700 (PDT)

info: stderr: [07-06-2018T01:02:21.318Z] <<< HTTP RESPON 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, expired=Mon, 01 Jan 1990 00:00:00 GMT, tanggal=Kamis, 07 Jun 2018 01:02:21 GMT, bervariasi=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=SAMAORIGIN, 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-agregate, 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= tidak ada, koneksi = tutup

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

Rabu 06 Juni 2018 18:02:21 GMT-0700 (PDT)

info: stderr: [07-06-2018T01:02:21.652Z] <<< HTTP RESPONSE 404 server=nginx, tanggal=Kamis, 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: [07-06-2018T01:02:21.652Z] <<< HTTP RESPONSE BODY code=PROJECT_NOT_FOUND, message=Proyek yang ditentukan tidak ditemukan.

@tomlarkworthy mengesampingkan client_id dan rahasia dengan nilai khusus tidak akan berfungsi, karena Firebase saat ini menggunakan klien yang telah ditentukan sebelumnya yang terpisah dari proyek pelanggan mana pun (setidaknya itulah pemahaman saya).

Selain itu, opsi --token hanya mendukung token penyegaran, yang tidak Anda dapatkan jika Anda memiliki akun layanan (sekali lagi, sejauh yang saya mengerti).

Kita perlu menemukan cara sederhana untuk menghasilkan token akses SA dengan ID klien ini, jika memungkinkan.

Dimungkinkan untuk mengambil rute alternatif dan memanggil Firebase API dengan klien JWT alih-alih token OAuth, seperti yang dijelaskan di sini: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#jwt -auth

google/google-auth-library-nodejs , yang digunakan secara internal oleh stephenplusplus/google-auto-auth , menyediakan metode yang lebih nyaman/aman untuk melakukan ini.

Saya tidak berpikir kita bisa membuat kemajuan.

https://github.com/firebase/firebase-tools/issues/647#issuecomment -361926336 tampaknya telah melaporkan keberhasilan sebelumnya, meskipun tidak yakin apakah itu dikonfirmasi. Tampaknya Firebase API yang dimaksud (https://admin.firebase.com/v1/projects) bersifat private , dan hanya menerima token yang dibuat untuk ID klien tersebut.

Mungkin ini harus diajukan sebagai permintaan fitur - memiliki kemampuan untuk menggunakan akun layanan untuk penerapan akan memungkinkan penggunaan kredensial tunggal (dan dipisahkan dari pengguna mana pun) untuk menerapkan sumber daya Firebase dan GCP.

Opsi --token dalam CLI dimaksudkan untuk diberikan token penyegaran , bukan token akses. Itu yang dihasilkan dari firebase login:ci .

Saya belum menguji otorisasi akun layanan secara ekstensif, tetapi saya menduga bahwa mungkin ada pemeriksaan IAM yang memerlukan izin luas yang terjadi di backend admin.firebase.com . Kami dapat menyelidiki lebih lanjut, tetapi saya tidak mengharapkan resolusi super cepat di sini.

Opsi --token di CLI dimaksudkan untuk diberikan token penyegaran

Ya, dipahami seperti yang disebutkan di atas.

Akan luar biasa menggunakan kunci SA untuk diterapkan dari lingkungan CI. Token penyegaran terikat pada pengguna tertentu, dan tidak jelas cara menggunakannya untuk mengautentikasi perintah gcloud untuk mengelola layanan GCP lainnya. Saat ini, kami harus menyediakan kedua jenis kredensial (token penyegaran pengguna admin untuk Firebase CLI, dan kunci SA untuk gcloud ).

Saya dapat FIREBASE_TOKEN='<token_here>' firebase deploy --only firestore,storage (Saya belum mencoba target lain, mungkin saja berhasil) menggunakan token yang dibuat untuk akun layanan.

Token sebenarnya dibuat untuk akun layanan oleh mesin rahasia GCP vault dengan cakupan " https://www.googleapis.com/auth/cloud-platform ".

Saya mengonfirmasi bahwa tidak mungkin menggunakan kunci SA + GOOGLE_APPLICATION_CREDENTIALS, dengan cli firebase terbaru, semua perintah keluar dengan:

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 itu menarik, apakah Anda tahu bagaimana vault menghasilkan token oauth untuk akun layanan?

@paolomainardi firebase list tidak akan berfungsi dengan kunci SA karena bergantung pada implementasi daftar proyek lama. Namun, hampir semua hal lain seharusnya (meskipun Anda mungkin perlu mengaktifkan beberapa API terlebih dahulu). Saya akan merekomendasikan mencoba perintah lain dan lihat.

Kami sedang berupaya mendapatkan dukungan penuh untuk GOOGLE_APPLICATION_CREDENTIALS tanpa melewati banyak rintangan karena kami pikir ini membuka beberapa kasus penggunaan yang hebat.

@paolomainardi Saya pikir implementasi vault ada di sini (itu hanya tebakan setelah pencarian cepat melalui kodenya).

Saya juga berpikir itu hal yang sama yang dilakukan gcloud alpha iam service-accounts sign-jwt (sekali lagi, tebakan yang agak terpelajar).

Terima kasih banyak @cpick , saya akan terus

Saya melihat sekilas ini dan sebagai tes mencoba memaksa melalui kredensial akun layanan dan access_token ke requireAuth.js
dalam upaya untuk setidaknya melihat sesuatu bekerja.

Tampaknya cli selalu mencoba untuk menghubungi https://admin.firebase.com/v1/projects/ tidak peduli apa (Anda dapat apa yang saya maksud dengan bendera --debug . Jika saya membaca komentar sebelumnya dalam masalah ini, itu mungkin 'legacy 'titik akhir api yang tidak' berfungsi dengan akun svc.

Saya memang menguji beberapa titik akhir lainnya dengan panggilan GET dan tampaknya baik-baik saja:

untuk ref


  • Modifikasi hardcode yang saya buat ke requireAuth.js hanya untuk pengujian yang akan mengembalikan token akses svc_accounts dengan cakupan luas
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");
 ......

  • Klien Umum
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);
    }); 

Saya akhirnya dapat menggunakan akun layanan ke firestore , storage dan hosting setelah melakukan pengeditan pada requireAuth.js seperti yang Intisari ini
ADC yang sudah ada..>

Berikut ini pada dasarnya adalah peretasan dan tidak lengkap karena tidak berfungsi dengan penerapan functions . Solusi lengkap yang disebutkan oleh mbleigh di atas untuk 'dukungan kelas satu' patut ditunggu.


Bagaimanapun, saya memverifikasinya sebagai berikut:

Mulailah dengan akun firebase yang juga dalam konteks dengan gcloud

  1. Dapatkan kunci pribadi akun layanan
$ 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. Tambahkan akun layanan sebagai OWNER pada proyek itu

  2. Buka konsol cloud dan aktifkan beberapa 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. Hapus kredensial lokal

Untuk gcloud dan firebase

$ firebase logout
✔  Logged out from [email protected]

$ mv ~/.config/gcloud ~/.config/gcloud_backup
  1. Setel ADC env-var dan terapkan
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. Verifikasi Penerapan

deployment_hosting

  1. Coba penyebaran functions

functions jenis penerapan mobilesdk.googleapis.com . Mungkin penerapan fungsi firebase terkait dengan client_id untuk fungsi firebase atau entah bagaimana membutuhkan 3LO....tapi itu semua dugaan

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

Referensi bug internal: 122552119

Apakah ada pembaruan tentang masalah ini @tinaliang ? Saya pikir dukungan akun layanan untuk otentikasi harus menjadi prioritas tinggi.

Tidak ada pembaruan saat ini ...

Temuan saya dari hari terakhir adalah bahwa saya tidak memerlukan fungsi Firebase Cloud khusus sehingga saya dapat menggunakan fungsi GCP Cloud https://cloud.google.com/functions/ yang berfungsi seperti yang diharapkan (penyebaran dilakukan melalui gcloud CLI) Namun, ini bukan solusi sebenarnya ... tapi mungkin bisa membantu seseorang :)

Digandakan oleh #1175

Sudah ada update belum? Saya mencoba menerapkan aplikasi Firebase saya melalui Cloud Build. hosting dll. tampaknya berfungsi dan disebarkan dengan benar. functions tidak akan digunakan dengan benar dan saya mendapatkan 404 , seperti dijelaskan di atas, dengan konfigurasi yang tepat dalam IAM. (Akun layanan cloudbuild memiliki hak untuk "Admin Firebase" dan "Admin Kunci API".) Tiket ini harus memiliki prioritas tinggi

Belum ada pembaruan, tetapi kami berharap untuk segera melihatnya.

@mbleigh ada pembaruan? mengonfirmasi sampai sekarang firebase CLI tidak dapat menggunakan akun layanan untuk menyebarkan? kami menginginkannya untuk alat CI. jadi dukungan GOOGLE_APPLICATION_CREDENTIALS tidak berfungsi?

Seperti disebutkan sebelumnya, tidak semua perintah CLI firebase akan bekerja dengan GOOGLE_APPLICATION_CREDENTIALS , tetapi jumlah yang baik seharusnya. Menyetelnya ke jalur kredensial akun layanan Anda harus menjadi semua yang perlu Anda lakukan (sebenarnya, itulah yang dilakukan skrip test-hosting.sh , antara lain).

Menggunakan firebase login:ci Anda harus dapat menggunakan token di sistem CI Anda

Memformalkan penggunaan dan kemampuan GOOGLE_APPLICATION_CREDENTIALS ada di pikiran kami, tetapi kami tidak dapat berkomitmen pada garis waktu di dalamnya. Terima kasih atas kesabaran Anda.

Bisakah Anda mengklarifikasi - akankah instance metadata ADC berfungsi dalam kasus ini, atau hanya GOOGLE_APPLICATION_CREDENTIALS ?

Siapa pun di utas ini: jika Anda merasa ingin bertualang, saya ingin Anda mencoba cabang di # 1463 dan melihat apakah itu memungkinkan Anda melakukan hal-hal yang ingin Anda lakukan dengan autentikasi akun layanan. Saya pikir kami mungkin telah menopang sebagian besar masalah, tetapi saya ingin melakukan pengujian eksternal semacam itu.

@mbleigh firebase apps:list web akan gagal sebentar-sebentar di Cloud Build. Menjalankan dengan debug tidak memberi kami informasi apa pun tentang alasan kegagalan. Setiap pemikiran tentang apa yang bisa terjadi?

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

Selain itu, perintah @mbleigh firebase use projectName juga akan sesekali gagal karena gagal menarik kredensial yang tepat dari server metadata:

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

Pada 10/02/20 saya mulai melihat kegagalan intermiten saat menggunakan cloudbuild untuk diterapkan ke hosting firebase saat menggunakan akun layanan. Itu secara konsisten baik-baik saja untuk sementara waktu sebelum itu dan sekarang tampaknya lebih sering gagal daripada tidak. Saya mulai bertanya-tanya apakah ada satu set izin baru yang perlu saya delegasikan ke akun layanan sehingga dapat melakukan ini dengan sukses. Ini menjadi sedikit masalah karena sebagian besar penerapan saya gagal

Di bawah ini adalah tangkapan layar dengan contoh build dan ketika mereka tiba-tiba mulai gagal:

image

Kesalahan debug sangat mirip dengan komentar di atas:

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

Ini tampaknya terkait dengan https://github.com/firebase/firebase-tools/issues/1970 (yaitu, penghentian titik akhir metadata instance v1beta1 , yang masih digunakan oleh autentikasi gcloud lama perpustakaan yang digunakan oleh Firebase CLI..)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat