Firebase-tools: Tambahkan emulator autentikasi firebase ke rangkaian emulator

Dibuat pada 26 Sep 2019  ·  66Komentar  ·  Sumber: firebase/firebase-tools

Apakah mungkin untuk meniru API otentikasi untuk pengembangan lokal yang lebih cepat dan pengujian ujung ke ujung? Dengan emulator Firestore, kita tidak perlu membuat project yang berbeda untuk lingkungan yang berbeda (dev, testing, staging, prod), kita cukup menggunakan emulator, seed data dari file JSON dalam mode watch untuk pengembangan, atau seeding untuk setiap test case, dll. Untuk dapat menulis pengujian ujung ke ujung yang memiliki login pengguna, navigasi berdasarkan peran, dan kemudian beberapa tindakan, kita harus membuat proyek terpisah untuk mengisolasi pengguna uji, dan juga menyemai dan menghapus pengguna di sana untuk setiap kasus uji.

emulator-suite feature request

Komentar yang paling membantu

Kami sedang bekerja keras pada emulator auth lengkap yang mudah-mudahan akan menjadi apa
semua orang ingin. Tidak ada garis waktu yang dapat saya tawarkan saat ini, tetapi ini adalah prioritas tinggi
untuk kita.

Pada Jumat, 22 Mei 2020 di 08:12 ChuckB [email protected] menulis:

@samtstern https://github.com/samtstern Ada kemajuan atau lainnya
solusi untuk masalah/fitur ini? Saya perlu (1) setEmulatedUser untuk bekerja dengan
emulator cloud Firestore sehingga saya dapat melakukan pengujian manual secara lokal.

Per komentar Anda: pada 17 Oktober 2019
_Saya pikir dengan jelas (2) adalah cerita yang tepat tetapi saya mencoba memahaminya
berapa banyak orang yang akan senang dengan (1) karena jauh lebih mudah untuk
menerapkan dan memelihara.

(1) Masuk untuk menggunakan layanan seperti Firestore atau Realtime Database tanpa
benar-benar menciptakan pengguna nyata. Saat ini seperti itu
setEmulatedUser akan menyelesaikannya. Itu hanya akan memungkinkan Anda untuk memiliki auth palsu
token secara lokal yang akan diterima oleh emulator tetapi akan ditolak oleh
melecut. Lebih aman, lebih terisolasi, dll._


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-632660684 ,
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/ACATB2Q4LV7NXMQFEALNPXLRSZT25ANCNFSM4I27PTFA
.

Semua 66 komentar

@vladimirdjurdjevic terima kasih telah mengangkat ini! Ini ada dalam daftar hal yang harus dilakukan, tetapi kami belum memutuskan berapa banyak layanan auth yang akan ditiru dan strategi terbaik untuk melakukannya. Hal-hal tertentu (seperti autentikasi anonim) sangat mudah untuk ditiru sementara yang lain (seperti otentikasi SMS) sangat sulit.

Tapi kami pasti ingin mengaktifkan kasus penggunaan ujung ke ujung yang Anda sebutkan!

Pertanyaan: apakah menurut Anda akan berguna jika ada perpustakaan yang memungkinkan Anda untuk secara lokal mengejek pengguna Firebase untuk digunakan dengan emulator? Sesuatu seperti:

firebase.auth().setEmulatedUser({
   uid: 'abc123',
   // ...
});

@samtstern Apakah panggilan ke setEmulatedUser() juga memicu fungsi cloud yang diemulasikan functions.auth.user().onCreate() ? Jika demikian, itu akan sangat berguna.

@samtstern Itu pasti akan membantu beberapa skenario pengujian, tetapi masih memerlukan contoh nyata untuk pengembangan. Ide saya adalah untuk menghindari membuat beberapa proyek firebase untuk lingkungan yang berbeda, dan untuk dapat berkembang secara lokal (mungkin offline). Pendekatan lain akan mendukung lingkungan yang berbeda untuk layanan. Jika kita dapat membuat lingkungan yang berbeda untuk katakanlah firestore dan auth di bawah proyek yang sama, itu akan menyelesaikan banyak masalah. Saya tahu saya dapat membuat proyek per lingkungan, tetapi itu benar-benar menyebalkan. Mengonfigurasi setiap lingkungan, mereplikasi data, dll. Idealnya, saya ingin dapat membuat satu proyek firebase, dan jika saya memerlukan data dummy untuk pengujian manual, saya dapat membuat lingkungan pementasan untuk firestore, dan mengunggah data di sana.

@noelmansour pertanyaan bagus! Itu tidak akan terlalu sulit untuk dilakukan, kami mungkin ingin dua panggilan berbeda seperti signInAsEmulatedUser dan signUpAsEmulatedUser mana hanya yang kedua yang memicu fungsi.

@vladimirdjurdjevic setuju sepenuhnya bahwa emulator berfitur lengkap adalah yang terbaik. Bisakah Anda menjelaskan hal-hal apa yang Anda perlukan dari "contoh nyata untuk pengembangan" yang tidak diselesaikan dengan dapat mengatur pengguna secara lokal?

Pertanyaan: apakah menurut Anda akan berguna jika ada perpustakaan yang memungkinkan Anda untuk secara lokal mengejek pengguna Firebase untuk digunakan dengan emulator?

Sangat bermanfaat, akan sangat membantu.
Saat ini saya hanya mengatur ke true fungsi aturan yang memvalidasi pengguna yang masuk setiap kali saya harus menguji sesuatu secara lokal, itu cukup tidak aman namun mungkin hal yang lebih sederhana yang dapat saya lakukan tanpa meniru pengguna saat ini.

Ya ini akan sangat berguna

Saya juga ingin menguji unit functions.auth.user().onCreate() . Saya kira saat ini solusi terbaik pada dasarnya adalah mengekspor fungsi panggilan balik yang diteruskan ke onCreate dan menyediakan objek user palsu ke dalamnya.

Untuk pengujian unit semacam itu, periksa firebase-functions-test
library, yang membantu Anda memanggil pengendali fungsi Anda dengan data tiruan.

Pada Sun, 13 Oktober 2019, 05:44 Daniel K. [email protected] menulis:

Saya juga ingin menguji unit functions.auth.user().onCreate(). Saya
misalkan saat ini solusi terbaik pada dasarnya adalah mengekspor panggilan balik
fungsi diteruskan onCreate dan menyediakan objek pengguna palsu untuk itu.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/firebase/firebase-tools/issues/1677?email_source=notifications&email_token=ACATB2QYJLX2LNVDTWJV25TQOMJ4VA5CNFSM4I27PTFKYY3PNVWWK3TUL52HS4DFVREXG43VMVBQ2JKTDNORPWQW54ZTDNORVWQW54ZTDNORVWQW54W63LNMVX
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/ACATB2SO3IR6UB73F4EMZPTQOMJ4VANCNFSM4I27PTFA
.

@samtstern Itu benar-benar berfungsi dengan emulator Firestore? Berdasarkan ini saya mendapat kesan itu untuk tujuan yang berbeda.

image
https://firebase.google.com/docs/functions/unit-testing#initializing

Saya tentu tidak ingin mode online untuk pengujian unit, itu akan menjadi slowpoke. Dan saya tidak yakin apakah saya dapat mengakses emulator Firestore dengan "mematikan".

@FredyC terima kasih telah menunjukkan dokumen itu. Kata-kata yang digunakan membingungkan karena "mode" bukanlah tombol yang dapat Anda aktifkan, melainkan hanya menggambarkan strategi yang dapat Anda ambil.

Jika Anda memulai emulator Firestore bersama pengujian unit Anda, kode Anda pasti dapat terhubung dengannya. Jika Anda menyetel variabel lingkungan FIRESTORE_EMULATOR_HOST , Firebase Admin SDK akan secara otomatis terhubung ke emulator Firestore ( firebase emulators:exec melakukan ini untuk Anda).

@samtstern Saya masih kesulitan menghubungkan titik-titik dan bagaimana semua itu akan membantu saya menguji functions.auth.user().onCreate() ? Maksud saya bagus bahwa fungsi akan terhubung ke emulator alih-alih versi produksi, tapi itu hanya Firestore, bukan? Bagaimana cara meminta pembuatan pengguna dari pengujian untuk benar-benar memiliki kode fungsi untuk memulai?

Tampaknya ada beberapa metode samar makeUserRecord dalam firebase-functions-test yang disebutkan, tetapi tidak masuk akal bagaimana cara kerjanya atau bagaimana cara menggunakannya.

Saya mencoba menelepon auth.createUserWithEmailAndPassword() dari paket @firebase/testing , tetapi itu mengeluh tentang kunci API yang tidak valid, jadi saya menganggap itu hanya akan berfungsi dengan versi online.

Ketika saya mencari melalui org untuk variabel env yang telah Anda sebutkan, itu hanya di tiga tempat dan sepertinya tidak ada yang benar-benar relevan dengan auth. Kecuali jika disembunyikan oleh beberapa rangkaian string.

Saya juga telah menelusuri https://github.com/firebase/functions-samples tetapi saya tidak menemukan contoh pengujian unit di sana.

Bisakah Anda memahami ini? :)

Saya juga punya kasus lain, agak berlawanan, di mana kode fungsi cloud menggunakan panggilan admin.auth().getUserByEmail() . Anehnya itu tidak berakhir dengan kesalahan, tetapi saya tidak tahu bagaimana saya akan membuat pengguna itu sehingga dapat dikembalikan. Kecuali tentu saja mengejek seluruh modul admin, tapi itu gila :)

@samtstern Maaf atas keterlambatannya. Ketika saya mengatakan contoh nyata, maksud saya contoh nyata :D Idealnya, saya hanya ingin menukar konfigurasi di file lingkungan sudut saya untuk pengembangan, dan untuk terus mengimplementasikan fitur auth seperti aplikasi saya berbicara dengan API nyata, tetapi sebenarnya emulator berjalan pada saya mesin, dan saya bisa melakukannya secara offline. Sekarang, saya mengerti tantangan dengan mengirim SMS misalnya. Akan konyol untuk mengharapkan emulator mengirim SMS nyata ke ponsel saya, tetapi Anda mungkin bisa mencetaknya ke konsol (konten SMS yang akan dikirim). Ini mungkin lebih merepotkan daripada nilainya dengan ini. Itu sebabnya saya pikir hanya mendukung beberapa lingkungan per proyek dapat membuat segalanya menjadi lebih baik. Dibutuhkan banyak waktu untuk mereplikasi konfigurasi antara beberapa proyek untuk lingkungan yang berbeda. Dan juga mengelola beberapa akun layanan untuk skrip agar dapat menyemai data ke berbagai proyek Firestore adalah hal yang merepotkan. Itulah mengapa saya mengajarkan bahwa jika kita memiliki seluruh platform firebase yang ditiru, kita dapat menggunakannya untuk setiap lingkungan non-produksi, dan mengelola hanya satu proyek firebase nyata. Tapi mungkin hanya mendukung beberapa lingkungan per proyek adalah solusi yang lebih baik dengan hasil yang dapat diterima.

@FredyC terima kasih atas semua tanggapan Anda! Sangat membantu bagi kami untuk melihat betapa membingungkannya hal ini. Ada dua hal utama yang ingin dilakukan orang dalam pengujian mereka yang terkait dengan auth:

  1. Masuk untuk menggunakan layanan seperti Firestore atau Realtime Database tanpa benar-benar membuat pengguna nyata. Saat ini itulah yang akan dipecahkan oleh sesuatu seperti setEmulatedUser . Itu hanya akan memungkinkan Anda untuk memiliki token autentikasi palsu secara lokal yang akan diterima oleh emulator tetapi akan ditolak oleh prod. Lebih aman, lebih banyak isolasi, dll.
  2. Sebenarnya menguji otentikasi secara langsung. Ini akan memiliki beberapa bagian:
    A. Emulator autentikasi yang merespons semua panggilan API yang diperlukan sehingga Anda dapat mengarahkan SDK Auth ke sana.
    B. Integrasi antara emulator tersebut dan emulator fungsi sehingga fungsi .onCreate terpicu dengan benar.
    C. Auto-mocking di dalam fungsi emulator sehingga admin.auth() menunjuk ke emulator Auth, seperti yang kita lakukan untuk Firestore dan RTDB hari ini.

Saya pikir jelas (2) adalah cerita yang tepat, tetapi saya mencoba memahami berapa banyak orang yang akan senang dengan (1) karena secara substansial lebih sederhana untuk diterapkan dan dipelihara.

@samtstern saya mengerti. Perbaiki saya jika saya salah, tetapi bukankah (1) sudah diselesaikan? Maksud saya dalam pengujian saya hanya dapat memanggil yang berikut dan emulator Firestore akan mengenali saya sebagai pengguna itu sehingga saya dapat menguji terhadap aturan keamanan. Saya belum benar-benar mencobanya, tetapi sejauh ini terlihat menjanjikan :)

  const app = firebase.initializeTestApp({
    projectId,
    auth: {
      uid: 'owner'
    }
  })

(2) jelas terdengar sangat berguna, tetapi jauh lebih rumit untuk ditangani. Sayangnya, wawasan saya tentang produk lengkap sangat terbatas, saya tidak dapat benar-benar menawarkan ide yang berguna di sini.

Saya pikir itu harus dibangun secara bertahap. Alih-alih mencoba mencakup semua skenario sekaligus, buatlah berdasarkan kasus penggunaan yang diketahui dan tambahkan saat bepergian. Menurut pendapat saya yang terbatas, meniru "database pengguna" bersama dengan pemicu fungsi tampaknya tidak terlalu sulit untuk dilakukan.

@FredyC Anda benar bahwa (1) diselesaikan untuk digunakan di dalam suite pengujian. Tetapi kasus penggunaan lainnya sebenarnya menghubungkan aplikasi Android/iOS/Web Anda langsung ke emulator untuk pengembangan lokal. Dalam hal ini Anda tidak dapat menggunakan @firebase/testing .

Jadi begitu. Sejujurnya, akan sangat bagus jika @firebase/testing dapat digunakan lintas platform daripada memiliki solusi terpisah. Maksud saya, seberapa sulitkah untuk mengarahkan komunikasi ke emulator? Bukankah FIRESTORE_EMULATOR_HOST untuk itu? Meskipun saya pikir sesuatu seperti FIREBASE_EMULATOR_HOST akan lebih tepat jika emulator akan memiliki layanan lain juga.

@vladimirdjurdjevic Saya berpikir, pada dasarnya tidak akan berfungsi untuk mengejek metode signInWithPhone sehingga Anda dapat mengontrol perilakunya? Maka Anda tidak perlu khawatir tentang emulator dan mendapatkan kode SMS simulasi di konsol :)

Tentu saja, Anda memerlukan beberapa cara untuk mengautentikasi ke emulator untuk Firestore (dan menghubungkannya). Sesuatu seperti yang saya uraikan di https://github.com/firebase/firebase-tools/issues/1677#issuecomment -542897671 sebelumnya. Ada metode dasar untuk menghasilkan token tidak aman: https://github.com/firebase/firebase-js-sdk/blob/master/packages/testing/src/api/index.ts#L64. Tidak yakin apakah itu akan berhasil.

Tentu saja, mengejek perpustakaan pihak ke-3 tidak selalu semudah itu, tetapi setelah diketahui, itu bisa membawa hasil yang bagus. Akhirnya, itu bisa diekstraksi ke beberapa perpustakaan untuk membuatnya lebih mudah.

Saya juga berpikir metode signIn ini dapat membuang cukup banyak kode kesalahan yang merupakan sesuatu yang harus diperhatikan oleh tes yang tepat juga. Itu mudah dilakukan dengan mengejek juga.

@samtstern Memperluas konteks namespace firebase.auth() dengan sesuatu yang topikal seperti setEmulatedUser tampaknya seperti anti-pola dengan strategi emulasi yang ada. Apakah rekomendasi itu mungkin dipengaruhi oleh kemudahan diperpanjang di sisi paket?

Sejalan dengan emulator lain, saya berharap tingkat layanan otentikasi terpisah diluncurkan melalui HTTP dan konfigurasi sisi klien dapat mengarahkan ulang permukaan API yang ada untuk digunakan.

Saya lebih suka kasus AuthN eksentrik mengembalikan kesalahan dengan Admin dan API Klien yang minimal mendukung CRUD untuk pengguna dasar daripada nama pengguna/kata sandi. Heck, saya pikir bahkan memulai dengan dukungan Token Kustom di Admin dan signInWithCustomToken akan sangat jauh. Mungkin menerapkan buah gantung rendah dengan matriks dukungan API yang diterbitkan di dokumen.

Untuk titik @FredyC , strategi saat ini untuk integrasi pengujian Auth adalah mengimpor @firebase/testing secara kondisional dalam kode aplikasi untuk merutekan ke panggilan initializeTestApp kustom. Tindakan ini menekankan pengecualian paket pada waktu pembuatan untuk tim proyek, dan juga menyebarkan konfigurasi pengalihan emulator di dua API paket ( initializeTestApp dan firestore.settings / functions.useFunctionsEmulator )

Retas planet ini!

strategi saat ini untuk integrasi Pengujian Auth adalah mengimpor @firebase/testing secara kondisional dalam kode aplikasi untuk merutekan ke panggilan initializeTestApp kustom.

Um, saya memanggil metode itu di dalam tes. Triknya adalah initializeApp berada di index.ts yang mengimpor fungsi. Itu dipanggil saat emulator dimulai, tetapi saat pengujian dijalankan, ini adalah proses yang berbeda dan tidak saling bertentangan. Jadi sebenarnya tidak ada beban impor bersyarat.

Tentu saja, ini mungkin berbeda untuk menguji auth di mis. aplikasi web tempat pelari uji akan membagikan proses dengan kode aplikasi. Namun, dengan pengujian unit, Anda biasanya tidak mengimpor seluruh aplikasi ke dalam pengujian. initializeApp mungkin dilakukan dalam beberapa kode yang tidak relevan dengan pengujian dan tidak diimpor sama sekali.

@FredyC Menyetujui penggunaan yang didokumentasikan untuk pengujian unit. Benar-benar berbicara dengan skenario aplikasi lengkap di mana apis menyimpang dan impor dinamis keluar dari peta yang didokumentasikan.

Saya hanya ingin memberi Anda atribusi untuk Honestly, it would be kinda superb if @firebase/testing could be used cross-platform instead of having separate solutions . lima tinggi digital

@FredyC terima kasih atas semua tanggapan Anda! Sangat membantu bagi kami untuk melihat betapa membingungkannya hal ini. Ada dua hal utama yang ingin dilakukan orang dalam pengujian mereka yang terkait dengan auth:

  1. Masuk untuk menggunakan layanan seperti Firestore atau Realtime Database tanpa benar-benar membuat pengguna nyata. Saat ini itulah yang akan dipecahkan oleh sesuatu seperti setEmulatedUser . Itu hanya akan memungkinkan Anda untuk memiliki token autentikasi palsu secara lokal yang akan diterima oleh emulator tetapi akan ditolak oleh prod. Lebih aman, lebih banyak isolasi, dll.
  2. Sebenarnya menguji otentikasi secara langsung. Ini akan memiliki beberapa bagian:
    A. Emulator autentikasi yang merespons semua panggilan API yang diperlukan sehingga Anda dapat mengarahkan SDK Auth ke sana.
    B. Integrasi antara emulator tersebut dan emulator fungsi sehingga fungsi .onCreate terpicu dengan benar.
    C. Auto-mocking di dalam fungsi emulator sehingga admin.auth() menunjuk ke emulator Auth, seperti yang kita lakukan untuk Firestore dan RTDB hari ini.

Saya pikir jelas (2) adalah cerita yang tepat, tetapi saya mencoba memahami berapa banyak orang yang akan senang dengan (1) karena secara substansial lebih sederhana untuk diterapkan dan dipelihara.

@samtstern pertama-tama saya akan ❤️memiliki emulasi semacam ini.

Saya akan melihat tidak. 1 sangat berguna untuk menulis tes e2e. Saat ini saya harus menggunakan contoh nyata untuk otentikasi sementara saya dapat menggunakan emulator untuk hosting, aturan, firestore, dan fungsi.

Saya pikir itu mungkin untuk menggunakan setEmulatedUser untuk mengejek pengguna dengan cara yang sama seperti yang dilakukan di firebase.initializeTestApp. Seharusnya dimungkinkan untuk mengirimkan, misalnya, token khusus dan data terkait pengguna lainnya.

Seharusnya juga dimungkinkan untuk mendapatkan kredensial sampel yang dapat digunakan di aplikasi klien dengan firebase.auth().signInWithCredential(credential)

Terima kasih @vladimirdjurdjevic telah mengangkat masalah ini! Kami sudah mencari solusi selama hampir satu tahun.

Kami ingin melihat emulator nyata untuk tiga hal:

  1. tes e2e untuk seluruh aplikasi, jadi kami tidak perlu membuat lingkungan yang berbeda seperti yang dikatakan @vladimirdjurdjevic .
  2. Tes integrasi untuk backend, tempat API dipanggil dan pengguna harus divalidasi di Firebase.
  3. Semua developer kami menggunakan lingkungan Firebase pusat selama pengembangan, yang menyebabkan banyak tabrakan. Tentu saja, setiap pengembang dapat membuat proyek Firebase mereka sendiri tetapi mereka masih perlu mengelola pengguna uji mereka di dasbor Firebase yang tidak ideal. Juga, kami ingin mengembangkan aplikasi kami secara offline yang tidak mungkin dilakukan hari ini karena kurangnya emulator nyata.

Saya harap Anda akan segera merilis sesuatu untuk kami, itu akan membuat produk Anda lebih berharga! Produktivitas pengembang sangat penting dalam layanan seperti itu!

Ini tampaknya menjadi fitur di daftar keinginan banyak orang. Firebase auth tampaknya menjadi IDaaS #1 saat ini dalam hal harga, jadi sangat disayangkan Anda tidak dapat mengembangkannya secara lokal dengan Cloud Functions. Semoga tim FB memiliki pembaruan untuk kami segera! 🙏

Sunting: Ping @mbleigh dari @firebase-ops karena utas ini terkubur dalam masalah ...

Saya juga memiliki kesalahan ini ... fungsi diabaikan karena emulator auth tidak ada atau tidak berjalan.

ini dipicu oleh kode ini:

function.auth.user().onDelete()

ada info tentang ini...

@dominikfoldi

Saya setuju dengan poin Anda. Satu tip yang mungkin bisa membantu Anda sementara itu:

Tentu saja, setiap pengembang dapat membuat proyek Firebase mereka sendiri tetapi mereka masih perlu mengelola pengguna uji mereka di dasbor Firebase yang tidak ideal.

Anda dapat menyemai dan mengelola pengguna secara terprogram menggunakan SDK admin firebase, misalnya auth().createUser , lihat juga https://firebase.google.com/docs/auth/admin/manage-users

Setelah membaca utas ini, saya pikir orang-orang di sini mungkin menganggap Foundry berguna.

Saya salah satu pendiri Foundry. Foundry adalah alat CLI yang mengambil Firebase Cloud Functions Anda dan membuat salinan aplikasi Firebase produksi Anda di server kami yang bertindak sebagai lingkungan pengembangan tempat Anda menjalankan kode secara langsung. Tidak diperlukan konfigurasi.

Foundry mengawasi file kode sumber Anda dan setiap kali Anda menyimpan kode Anda secara lokal, kami menjalankannya di server kami dan mengembalikan hasilnya hanya dalam beberapa detik. Semuanya super cepat.
Anda menentukan data Firestore, RealtimeDB, dan Pengguna Auth apa yang harus disalin dari aplikasi produksi Anda melalui file YAML kami sehingga Anda menyediakannya selama pengembangan.

 users:
      - getFromProd: 5 # Copy first 5 users from your Firebase project
      - getFromProd: ['id-1', 'id-2'] # Copy users with the specified IDs from your Firebase project

 # Copy first 3 documents from production from the collection 'userWorkspaces'
 # also add a custom document with id 'new-user-workspace' with a new data
 # format that you want to use
 firestore:
     - collection: userWorkspaces
       docs:
         - getFromProd: 3
         - id: new-user-workspace
           data: {"newDataFormat": 42}

Anda juga menentukan bagaimana kami harus memicu fungsi cloud Anda saat kami menjalankan kode Anda. Ini berfungsi seperti REPL untuk fungsi cloud Anda. Dengan begitu, Anda selalu yakin bahwa fungsi cloud Anda akan berfungsi dengan benar dengan data produksi dan di lingkungan produksi setelah Anda menerapkannya.
Selain itu, fungsi cloud Anda bertindak seolah-olah digunakan.

Lingkungan dev ini dibuat ad-hoc setelah Anda memulai sesi Anda. Jadi semua orang di tim Anda beroperasi di lingkungan mereka sendiri di mana mereka dapat dipusingkan.

Saya tidak ingin mengirim spam ke diskusi di sini, jadi jangan ragu untuk mengirimi saya pertanyaan melalui email
Saya dengan senang hati membantu Anda menyiapkan Foundry di proyek Anda, kirimkan saja email kepada saya!

Namun, dari cara Anda menggambarkannya dan apa yang saya baca di beranda, layanan itu berbasis cloud.
Emulator Firebase malah bekerja bahkan offline, oleh karena itu kegunaannya untuk pengujian otomatis.

@samtstern Ada kemajuan atau solusi lain untuk masalah/fitur ini? Saya perlu (1) setEmulatedUser untuk bekerja dengan emulator cloud Firestore sehingga saya dapat melakukan pengujian manual secara lokal. Opsi lain adalah memiliki argumen baris perintah yang menetapkan id pengguna saat emulator dimulai. Dengan cara ini emulator akan berjalan di bawah id pengguna yang diberikan selama start-up. Dengan cara ini aturan dapat diuji secara lokal.

Per komentar Anda: pada 17 Oktober 2019
_Saya pikir dengan jelas (2) adalah cerita yang tepat, tetapi saya mencoba memahami berapa banyak orang yang akan senang dengan (1) karena secara substansial lebih sederhana untuk diterapkan dan dipelihara.

(1) Masuk untuk menggunakan layanan seperti Firestore atau Realtime Database tanpa benar-benar membuat pengguna nyata. Saat ini, itulah yang akan dipecahkan oleh setEmulatedUser. Itu hanya akan memungkinkan Anda untuk memiliki token autentikasi palsu secara lokal yang akan diterima oleh emulator tetapi akan ditolak oleh prod. Lebih aman, lebih terisolasi, dll._

Kami sedang bekerja keras pada emulator auth lengkap yang mudah-mudahan akan menjadi apa
semua orang ingin. Tidak ada garis waktu yang dapat saya tawarkan saat ini, tetapi ini adalah prioritas tinggi
untuk kita.

Pada Jumat, 22 Mei 2020 di 08:12 ChuckB [email protected] menulis:

@samtstern https://github.com/samtstern Ada kemajuan atau lainnya
solusi untuk masalah/fitur ini? Saya perlu (1) setEmulatedUser untuk bekerja dengan
emulator cloud Firestore sehingga saya dapat melakukan pengujian manual secara lokal.

Per komentar Anda: pada 17 Oktober 2019
_Saya pikir dengan jelas (2) adalah cerita yang tepat tetapi saya mencoba memahaminya
berapa banyak orang yang akan senang dengan (1) karena jauh lebih mudah untuk
menerapkan dan memelihara.

(1) Masuk untuk menggunakan layanan seperti Firestore atau Realtime Database tanpa
benar-benar menciptakan pengguna nyata. Saat ini seperti itu
setEmulatedUser akan menyelesaikannya. Itu hanya akan memungkinkan Anda untuk memiliki auth palsu
token secara lokal yang akan diterima oleh emulator tetapi akan ditolak oleh
melecut. Lebih aman, lebih terisolasi, dll._


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-632660684 ,
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/ACATB2Q4LV7NXMQFEALNPXLRSZT25ANCNFSM4I27PTFA
.

1. Masuk untuk menggunakan layanan seperti Firestore atau Realtime Database tanpa benar-benar membuat pengguna nyata. Saat ini, itulah yang akan dipecahkan oleh setEmulatedUser. Itu hanya akan memungkinkan Anda untuk memiliki token autentikasi palsu secara lokal yang akan diterima oleh emulator tetapi akan ditolak oleh prod. Lebih aman, lebih banyak isolasi, dll.

Saya akan senang dengan Nomor 1 di sini, untuk sementara

@rishisingh-dev tidak mungkin menjalankan emulator auth karena emulator firebase saat ini tidak mengirimkannya.

Tetapi sangat mungkin untuk menguji fungsi cloud yang melibatkan auth di dalamnya. Anda dapat memfaktorkan ulang fungsi yang memerlukan beberapa API auth dan mengejeknya pada pengujian, sambil memberikan yang asli pada file fungsi firebase. Fidelitas pengaturan pengujian Anda lebih rendah, tetapi kemudian menjadi masalah derajat, bukan masalah jenis: Anda hanya menguji panggilan auth secara langsung tetapi Anda dapat menguji apa yang Anda harapkan.

Dalam pertanyaan SO itu akan menjadi seperti:

function sendWelcomeEmail(user) {
  console.log(user.uid);
  console.log(user.email);
  console.log(user.displayName);
}

exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => sendWelcomeEmail(user));

Dan pada pengujian Anda, Anda memanggil sendWelcomeEmail secara langsung untuk memastikan ia melakukan apa yang Anda perlukan.

Bayangkan Anda memiliki fungsi cloud yang lebih rumit yang disebut addFriend , di mana pengguna memasukkan email teman dan Anda menginginkan uid. Anda bisa mendapatkannya melalui auths getUserByEmail .

function addFriend(email, getUserByEmail ) {
  const friendUid = getUserByEmail(email);
  // do things with friendUid;
}

exports.addFriend = functions.https.onCall(async (data, context) => {
  const email = data.email;
  const getUserByEmail = (email) => admin.auth().getUserByEmail(email);
  return { res: await addFriend(email, getUserByEmail ) };
}

Pada deklarasi cloud fn Anda mengirim getUserByEmail , tetapi pada pengujian Anda, Anda malah mengirim yang palsu:

async function testAddFriend() {
  const emails = {"[email protected]": "test-uid")
  const fakeGetUserByEmail = (email) => emails[email];
  addFriend("[email protected]);
  // verify the things were done with friendUid
}

Saya tidak merasa ini berbeda secara signifikan dengan menguji API pihak ketiga mana pun dalam pengujian unit. Memiliki emulator firebase menyediakan auth menghapus boilerplate ke skenario pengujian ujung ke ujung, tetapi itu tidak secara signifikan mengubah pengujian unit karena Anda tidak ingin status persisten disimpan di antara pengujian.

Saya ingin dapat menjalankan ini secara lokal tanpa harus mengunggah ke cloud untuk memeriksa

export const onCreate = functions.auth.user().onCreate((user) => {
    addGravatarURLtoUserData(user.uid, user.email)
})

export const addGravatarURLtoUserData = async (uid, email) => {
    const hash = crypto.createHash("md5").update(email).digest("hex")
    await admin.database().ref(`users/${uid}`).update({ gravatarURL: uid })
}

Omong-omong, bisakah saya memasukkan user.displayName di dalam fungsi onCreate?

ya jika sudah diatur saya pikir, apakah Anda mencobanya?

Ya, itu mengembalikan nol.
Saya mencobanya di cloud (bukan lokal).

Screen Shot 2020-07-10 at 2 43 12 AM

Kode saya di sini.

exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => {
  console.log(user.uid);
  console.log(user.email);
  console.log(user.displayName);
});

Menarik juga saya tidak menggunakan nama tampilan, saya menggunakan nama tampilan pengguna khusus untuk
db waktu nyata

/**
 * updates Custom data in the realtime datastore users object, except for the username
 * <strong i="7">@param</strong> data
 * <strong i="8">@returns</strong> {Promise<void>}
 */
export async function updatePersonalData(data) {
    const { displayName } = data
    try {
        await firebase
            .database()
            .ref("users/" + firebase.auth().currentUser.uid)
            .update({
                displayName: displayName,
            })

        userDataStore.update((user) => {
            return { ...user, displayName: displayName }
        })
    } catch (e) {
        alert(e.message)
    }
}

Pada Jumat, 10 Jul 2020 pukul 10:44, risishingh-dev [email protected]
menulis:

Ya, itu mengembalikan nol.
Saya mencobanya di cloud (bukan lokal).

[gambar: Screen Shot 2020-07-10 pukul 2 43 12 AM]
https://user-images.githubusercontent.com/56976320/87140958-29f3ac80-c257-11ea-98d3-084fad619de7.png

Kode saya di sini.

console.log(pengguna.uid);
console.log(pengguna.email);
console.log(namapengguna.display);
});```


Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-656587759 ,
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/AABU35Q27EMMHYAYU5CNZR3R23PIDANCNFSM4I27PTFA
.

>

Salam Hormat

Nikos Katsikanis

Ya, tujuan utama saya adalah memperbarui database dengan informasi pengguna di dalam fungsi onCreate .
Tetapi karena saya tidak bisa mendapatkan displayName , saya membuat fungsi onCallable , dan melakukannya.

Terima kasih.

@samtstern Saya sangat senang melihat Anda mengerjakan ini :) Baru saja memulai proyek baru dengan firebase, dan pengalaman dev sudah jauh lebih baik (dengan opsi ui emulator dan --inspect-functions). Menantikan untuk melihat emulator auth beraksi :) Kerja bagus!

hal terbaik lainnya adalah saya tidak perlu membuka chrome tanpa keamanan

@samtstern

Dua bulan kemudian, apakah sekarang mungkin untuk memberikan perkiraan kasar?

Kami ingin mengirim awal tahun depan. Kita sekarang dihadapkan pada keputusan apakah kita mulai menulis tes integrasi terhadap proyek nyata atau jika kita menunggu beberapa bulan untuk emulator auth. Bisakah Anda membantu kami sedikit di sini?

Terbaik,

Niklas

Kebijakan kami di Firebase tidak memberikan perkiraan kapan sesuatu akan diluncurkan kecuali kami yakin 100%. Saat ini kami sedang bekerja keras pada emulator Auth tetapi kami belum cukup dekat untuk memilih tanggal peluncuran.

Ini adalah salah satu prioritas utama kami, tetapi saya pikir Anda tidak perlu menunggu kami untuk mulai menguji aplikasi Anda. Tulis pengujian Anda terhadap prod hari ini, alihkan untuk menargetkan emulator saat tersedia.

Baiklah, terima kasih @samtstern. Itu membantu!

Sesuatu yang benar-benar ingin kami gunakan untuk emulator auth adalah menguji Cloud Functions dan permintaan Firestore yang melibatkan Klaim Kustom pada token pengguna. Kami dapat mengurutkan pengujian klaim khusus dengan Firestore di taman bermain aturan di Firebase Console, tetapi emulator autentikasi lengkap secara teoritis akan memungkinkan kami melakukan lebih banyak hal dalam cara pengujian terkait token pengguna.

Untuk lebih jelasnya: kami berkomitmen pada emulator autentikasi lengkap yang mengemulasi titik akhir layanan yang sebenarnya (jika memungkinkan). Kami tidak lagi mempertimbangkan sesuatu yang ringan seperti yang disarankan komentar saya

@samtstern itu bagus untuk didengar (bersama dengan klaim khusus, karena itu sering digunakan dengan integrasi pihak ketiga). Apakah ada tempat untuk mengikuti perkembangan/ETA?

@fandy tidak maaf kami belum memiliki apa pun untuk dibagikan ...

Terima kasih Sam, saat ini saya melakukan semua pengujian saya secara manual karena tidak
sepadan dengan usaha untuk menulis tes e2e tanpa olok-olok Auth

Pada Rabu, 26 Agustus 2020 pukul 14:32, Sam Stern [email protected] menulis:

>
>

@fandy https://github.com/fandy tidak maaf kami tidak punya apa-apa untuk
belum berbagi...


Anda menerima ini karena Anda berlangganan utas ini.
Balas email ini secara langsung, lihat di GitHub
https://github.com/firebase/firebase-tools/issues/1677#issuecomment-680850282 ,
atau berhenti berlangganan
https://github.com/notifications/unsubscribe-auth/AABU35UAQDBYEXKKINJSM43SCT6E7ANCNFSM4I27PTFA
.

--

Salam Hormat

Nikos Katsikanis

Untuk mengatasinya, saya bereksperimen dengan mengimpor @firebase/testing di browser. Itu tidak berhasil. Namun, ini berfungsi: mangle @firebase/testing source untuk menyalin potongan yang sedikit diedit berikut:

import firebase from "firebase/app"
import * as component from "@firebase/component"
import * as util from "@firebase/util"
import { __awaiter, __generator } from "tslib"

function createUnsecuredJwt(auth) {
    // Unsecured JWTs use "none" as the algorithm.
    var header = {
        alg: 'none',
        kid: 'fakekid'
    };
    // Ensure that the auth payload has a value for 'iat'.
    auth.iat = auth.iat || 0;
    // Use `uid` field as a backup when `sub` is missing.
    auth.sub = auth.sub || auth.uid;
    if (!auth.sub) {
        throw new Error("auth must be an object with a 'sub' or 'uid' field");
    }
    // Unsecured JWTs use the empty string as a signature.
    var signature = '';
    return [
        util.base64.encodeString(JSON.stringify(header), /*webSafe=*/ false),
        util.base64.encodeString(JSON.stringify(auth), /*webSafe=*/ false),
        signature
    ].join('.');
}

function initializeApp(accessToken, options) {
    var _this = this;
    var app = firebase.initializeApp(options);
    if (accessToken) {
        var mockAuthComponent = new component.Component('auth-internal', function () {
            return ({
                getToken: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
                    return [2 /*return*/, ({ accessToken: accessToken })];
                }); }); },
                getUid: function () { return null; },
                addAuthTokenListener: function (listener) {
                    // Call listener once immediately with predefined accessToken.
                    listener(accessToken);
                },
                removeAuthTokenListener: function () { }
            });
        }, "PRIVATE" /* PRIVATE */);
        app._addOrOverwriteComponent(mockAuthComponent);
    }
    return app;
}

export function initializeTestApp(options) {
  let accessToken = undefined
  if (options.auth !== undefined) {
    accessToken = createUnsecuredJwt(options.auth)
  }
  return initializeApp(accessToken, options)
}

Sekarang di kode sisi browser aplikasi Anda, Anda dapat mengimpornya, dan

  let app
  if (dev) {
    app = initializeTestApp({projectId: "test", auth: {uid: "testuser"}})
    app.firestore().settings({
      host: "localhost:8080",
      ssl: false,
    })
  } else {
    app = firebaseProduction.initializeApp({ firebase config here })
    app.firestore().settings({ firestore config here })
  }
  window.firebase = app

Itu bekerja dengan baik! Sekarang ketika saya menjalankan dalam pengembangan, saya memiliki pengguna palsu lokal yang menurut emulator adalah "pengguna penguji" (seperti yang ditunjukkan oleh panduan pengujian aturan keamanan firestore).

Solusi lain yang saya gunakan adalah mematikan otentikasi Anda (saya menggunakan pengguna palsu yang dihasilkan untuk pengujian).

Contoh TypeScript:

import type { User as AuthUser } from '@firebase/auth-types'
// not importing a type, but a module of types
import { auth as authTypes} from 'firebase/app'
type Auth = authTypes.Auth

export const authStub = {
    getUser(uid: string) {
        // for uids like `testuser1234uid`
        let n = uid ? uid.replace("testuser", '').replace("uid", '') : ''
        return Promise.resolve({
            uid,
            email: `test.user${n}@foo.com`,
            emailVerified: true,
            providerData: [{
                providerId: 'google.com',
                email: `test.user${n}@foo.com`,
                uid: `testuser${n}provideruid`,
                phoneNumber: null,
                displayName: `Test User ${n}`.trim(),
                photoURL: 'https://thispersondoesnotexist.com/image',
            }],
            metadata: {
                // https://firebase.google.com/docs/reference/admin/node/admin.auth.UserMetadata
                createTime: new Date().toUTCString(),
                lastSignInTime: new Date().toUTCString()
            },
            customClaims: {
                username: `testuser${n}`
            }
        })
    },
    deleteUser(uid: string) {
        return Promise.resolve()
    },
    async updateUser(uid: string, data: AuthUser) {
        let user = await this.getUser(uid)
        return { ...user, data }
    },
    setCustomUserClaims(uid: string, customUserClaims: Object): Promise<void> {
        return Promise.resolve()
    }
}

export const auth = <Auth><unknown>authStub

Ubah juga aturan Anda karena auth.token tidak ditiru. Contohnya:

const rules = fs.readFileSync(__dirname + '/src/firebase/firestore/firestore.rules', 'utf8')
const modifiedRules =
    rules
        .replace(/request\.auth\.token\.email_verified/g, "true")
        .replace(/request\.auth\.token\.firebase\.sign_in_provider/g, "'password'")

await firebase.loadFirestoreRules({ projectId, rules: modifiedRules })

Ini bekerja dengan baik untuk saya. Semoga membantu…

Jika Anda mengikuti utas ini dan ingin menjadi penguji Alfa dari Firebase Authentication Emulator, ikuti langkah-langkah berikut:

  1. Mendaftar untuk program Firebase Alpha: https://services.google.com/fb/forms/firebasealphaprogram/
  2. Kirimi saya email di [email protected] , pastikan untuk mengirimkannya dari alamat email yang akan Anda gunakan untuk pengujian.

Harap lakukan ini hanya jika Anda benar-benar tertarik untuk mencoba emulator tahap awal dan memberikan umpan balik! Akan ada bug dan beberapa bagian pengaturan akan sulit, tetapi kami ingin tahu pendapat Anda.

@samtstern Ini adalah berita bagus! Saya ingin mencobanya, tetapi saya akan memproduksi dengan proyek saya saat ini pada akhir minggu, jadi saya tidak dapat memainkannya saat ini. Akan mendaftar untuk alpha sesegera mungkin :) Terima kasih atas kerja bagusnya.

100% akan ingin mencoba ini! Anda pria Sam!

@samtstern menantikan untuk mencobanya dan membantu apa pun yang saya bisa!

Saya perlu menggunakan fitur auth untuk menguji fungsi secara lokal dari Android, konteks Auth selalu nol

Kabar baik, Emulator Otentikasi adalah bagian dari rilis baru

Terima kasih untuk orang-orang kerja keras dan @samtstern 💪

orang-orang hebat!

Aku hanya utusan! Emulator Auth 99% dibuat oleh @yuchenshi ... dan itulah mengapa saya akan membiarkan dia mendapat kehormatan untuk menutup masalah ini ketika dia bangun.

Apakah ada dokumentasi tentang emulator baru ini? (cara menginstal, mengkonfigurasi klien, dll)

PSTerima kasih banyak untuk semua kerja keras ini. Ini akan memungkinkan segala macam hal keren bagi kita.

@nicoburns segera! Pengumuman resmi, dokumen, dan semua hal bagus itu akan segera hadir.

Kabar baik! :) Tidak sabar untuk mencobanya :)

Saya tahu Anda sudah menunggu ini, jadi langsung saja ke intinya:

  • Firebase Authentication Emulator kini tersedia. Anda bisa mendapatkannya dengan menginstal Firebase CLI >= v8.14.0.
  • Ikuti panduan Emulator Suite untuk memulai , dan hubungkan aplikasi Anda .
  • Untuk pengumuman menarik seperti ini dan banyak lagi, saksikan streaming langsung Firebase Summit SEKARANG.**

**Plug tak tahu malu: Saya juga melakukan sesi tentang "Cara menyiapkan CI menggunakan rangkaian Firebase Emulator" hari ini. Menemukan bahwa pada jadwal sesi yang tersisa sebagai latihan untuk pembaca.


_P.S. Saya benar-benar tidak dapat mengambil 99% dari kredit karena Emulator Auth tentu saja adalah kerja tim. Berbagai orang di Firebase dan pengembang Firebase (Anda) juga berperan besar dalam hal ini. Terima kasih!_

@yuchenshi Apakah mungkin untuk mengekspor pengguna yang dibuat saat keluar, seperti halnya dengan emulator firestore?

@vdjurdjevic belum, kami sedang mengerjakannya.

Ini adalah masalah yang sangat populer dan setiap pembaruan memberi tahu 50-100 orang. Karena kami sekarang telah merilis emulator Auth, saya akan mengunci masalah ini dari pembaruan di masa mendatang. Jika Anda memiliki pertanyaan, bug, atau permintaan fitur, silakan mulai masalah baru!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat