Buat Custom Token Tanpa Servis Akun Kredensial
Aplikasi Firebase sisi server memerlukan kredensial Google untuk mengotorisasi panggilan layanan back-end yang mereka buat. Biasanya pengembang memenuhi persyaratan ini dengan menulis sedikit kode untuk memuat file JSON akun layanan Google, dan memasukkannya ke dalam Firebase Admin SDK. Listing 1 menunjukkan contoh tampilannya di Node.js.
const admin = require('firebase-admin');
# Load the service account JSON file
const serviceAccount = require('./service_account.json');
# Inject into the Admin SDK as a credential
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
Meskipun ini tidak terlalu rumit, ini memaksa pengembang untuk mengemas file JSON akun layanan, dan juga memikirkan cara untuk mengamankan file tersebut dari paparan. Kredensial akun layanan memberikan akses istimewa ke berbagai layanan Firebase dan Google Cloud, dan Anda tentu tidak ingin itu berakhir di tangan yang salah. Untungnya, Firebase Admin SDK juga mendukung Kredensial Default Aplikasi Google. Mereka adalah cara yang bagus untuk memisahkan kode aplikasi dari mekanisme otorisasi, sementara tidak harus secara langsung merujuk file JSON akun layanan. Kredensial Default Aplikasi (ADC) didukung di waktu proses yang dikelola Google seperti Google Cloud Functions dan Google App Engine. Daftar 2 menunjukkan cara menulis ulang contoh sebelumnya menggunakan ADC alih-alih kredensial akun layanan.
const admin = require('firebase-admin');
admin.initializeApp();
Lebih sederhana, bukan? Meskipun metode inisialisasi ini memungkinkan Anda untuk menggunakan sebagian besar fitur Admin SDK, seperti yang diketahui oleh pengembang Firebase yang berpengalaman, ada juga beberapa batasan. Terutama, Firebase Admin SDK tidak dapat membuat token khusus saat diinisialisasi dengan ADC. Token khusus memerlukan kunci pribadi untuk menandatangani JWT, dan Admin SDK hanya dapat memperolehnya dari kredensial akun layanan. Nah, hari-hari itu sudah berakhir sekarang! Firebase Admin SDK baru saja meluncurkan pembaruan yang memungkinkan pengembang membuat token khusus bahkan saat menggunakan ADC.
Bagaimana cara kerjanya?
Kemampuan baru ini dimungkinkan oleh Identity and Access Management (IAM) API yang merupakan bagian dari Google Cloud Platform (GCP). IAM menyediakan titik akhir aman yang menandatangani data dari jarak jauh saat dipanggil dengan ID akun layanan yang valid. Setiap akun layanan memiliki ID unik di ekosistem GCP, yang terlihat seperti [email protected].
ID akun layanan dapat diteruskan ke IAM API, tempat ID tersebut menandatangani data menggunakan kunci pribadi yang sesuai (GCP mengetahui dan mengelola pasangan kunci dari setiap akun layanan). Dengan cara ini, pengembang hanya perlu menentukan ID akun layanan, yang bukan merupakan informasi sensitif, dan menghindari referensi ke seluruh file JSON akun layanan. Selain itu, dalam runtime yang dikelola Google ada cara untuk menemukan ID akun layanan secara otomatis, sehingga tidak perlu menentukannya.
Dengan integrasi IAM, Firebase Admin SDK sekarang mengikuti protokol berikut (dalam urutan yang ditentukan) untuk menandatangani token khusus.
- Jika diinisialisasi dengan file JSON akun layanan, SDK hanya menggunakan kunci pribadi yang tersedia di dalamnya untuk menandatangani token secara lokal. Ini pada dasarnya adalah apa yang telah dilakukan SDK sampai sekarang, sehingga aplikasi Anda yang sudah ada yang membuat token khusus akan terus berfungsi.
- Semua Firebase Admin SDK sekarang menerima nilai
serviceAccountId
sebagai opsi aplikasi . Jika ditentukan, SDK memanggil IAM API untuk menandatangani token dari jarak jauh. Anda dapat menemukan ID akun layanan dari Firebase atau GCP console. Anda juga bisa mendapatkannya dari file JSON akun layanan yang diunduh dengan mencari bidangemail_klien
. - Aplikasi Java, Python, dan Go di lingkungan standar Google App Engine menggunakan Layanan Identitas Aplikasi disediakan oleh runtime untuk menandatangani token. Layanan ini menggunakan akun layanan yang disediakan secara otomatis untuk aplikasi Anda oleh GCP.
- Saat berjalan di runtime yang dikelola Google yang berbeda (Cloud Functions, Compute Engine, dll.), SDK secara otomatis menemukan ID akun layanan melalui lmetadata lokal server. ID akun layanan ini digunakan bersama dengan IAM API untuk menandatangani token dari jarak jauh — mirip dengan langkah 2 di atas.
Artinya, developer di lingkungan seperti Google Cloud Functions, App Engine, dan Compute Engine dapat menggunakan kode yang mirip dengan listingan 3 untuk membuat token kustom untuk klien Firebase.
const admin = require('firebase-admin');
admin.initializeApp();
admin.auth().createCustomToken('testuid').then((token) => {
console.log('Custom token created:', token);
}).catch((err) => {
console.log('Error:', err);
});
Bergantung pada runtime yang tepat, daftar 3 memicu langkah 3 atau 4 dalam protokol di atas. Jika Anda tidak ingin Admin SDK menemukan ID akun layanan secara otomatis, Anda dapat memberikannya secara eksplisit sehingga langkah 2 dapat diterapkan.
Peringatan dan Pemecahan Masalah
Anda kemungkinan akan mengalami beberapa hambatan saat menggunakan fitur penandatanganan token berbasis IAM yang baru. Untungnya, mereka mudah ditemukan selama pengujian, dan dapat diperbaiki sekali dan untuk semua melalui konfigurasi satu kali.
Mengaktifkan API IAM
IAM API tidak diaktifkan untuk proyek Firebase secara default. Oleh karena itu, saat Admin SDK melakukan panggilan API IAM pertama kalinya, ia akan menerima kesalahan yang terlihat seperti berikut:
Identity and Access Management (IAM) API has not been used in project 1234567890 before or it is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/iam.googleapis.com/overview?project=1234567890 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
Cukup ikuti link yang diberikan dalam pesan error, yang akan membawa Anda ke halaman konfigurasi IAM API GCP console. Klik tombol besar "Aktifkan API", dan ke tahap berikutnya.
Menyiapkan izin yang diperlukan
Untuk menandatangani data dengan IAM, ID akun layanan yang diteruskan ke API harus memiliki izin tertentu. Secara default, ID akun layanan yang Anda dapatkan dari Firebase console, dan yang ditemukan secara otomatis melalui Cloud Functions tidak memiliki izin ini. Karenanya Anda mungkin mendapatkan kesalahan yang terlihat seperti ini:
Permission iam.serviceAccounts.signBlob is required to perform this operation on service account projects/-/serviceAccounts/{your-service-account-id}.
Untuk mengatasi error ini, Anda harus membuka halaman IAM dan admin GCP console, dan menetapkan peran pembuat token akun Layanan ke akun layanan yang dimaksud.
Lihat dokumentasi resmi untuk detail lebih lanjut tentang peringatan ini, dan petunjuk pemecahan masalah langkah demi langkah yang terperinci. Selain itu, di masa mendatang, masalah ini kemungkinan akan diatasi di infrastruktur Firebase/GCP, sehingga menghasilkan pengalaman orientasi yang lebih bersahabat bagi developer.
Bagaimana jika saya tidak menggunakan runtime yang dikelola Google. Apa yang harus saya lakukan?
ADC adalah fitur yang didukung di runtime yang dikelola Google. Oleh karena itu, opsi paling sederhana bagi pengembang yang menggunakan lingkungan lain adalah tetap menggunakan kredensial akun layanan. File JSON akun layanan memainkan dua peran dalam konteks ini — kredensial dan mekanisme penandatanganan. Menemukan pengganti keduanya tanpa dukungan waktu proses GCP tidaklah mudah.
Namun, Anda masih dapat memperbaikinya dengan memisahkan kode Anda dari file JSON akun layanan. Pasang file JSON akun layanan di lingkungan runtime Anda, dan setel variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS
untuk mengarah ke sana. Kemudian Anda dapat menggunakan sintaks inisialisasi ADC biasa dalam kode Anda (daftar 2). Tentu, itu tidak sepenuhnya menghilangkan file JSON akun layanan, tetapi setidaknya itu memisahkan kode Anda dari kredensial, memberi Anda portabilitas dan fleksibilitas yang lebih besar. Bergantung pada alur DevOps yang tepat, Anda bahkan mungkin dapat mendelegasikan penerapan file JSON akun layanan ke sysadmin atau SRE Anda.
Mungkin ada cara untuk sepenuhnya menghilangkan file JSON akun layanan dengan menggunakan opsi ID akun layanan yang dikombinasikan dengan kredensial token kustom atau segarkan. Ini belum diuji, dan saya ingin bereksperimen dengannya sedikit lebih banyak sebelum membahas detailnya. Jika seseorang pernah mencoba sesuatu seperti ini, tolong beri tahu saya. Juga, saya ingin mendengar ide lain tentang bagaimana skenario ini dapat ditangani dengan lebih baik.
Variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS
juga bagus untuk menguji kode Anda secara lokal, sebelum dikirim ke GCP untuk penerapan. Ini memberi Anda cara untuk menjalankan kode yang sama di GCP produksi dan lingkungan pengembangan lokal Anda.
Bagaimana dengan menandatangani URL Cloud Storage?
Jika Anda pernah mencoba membuat URL bertanda tangan untuk objek Cloud Storage Anda dari Firebase Admin SDK, maka Anda tahu itu kasus penggunaan lain yang memerlukan kredensial akun layanan eksplisit. Dalam hal ini, penandatanganan ditangani oleh library Google Cloud Storage (GCS) yang menjadi sandaran Firebase Admin SDK. Pustaka ini tidak banyak berubah, jadi Anda harus terus menggunakan kredensial akun layanan untuk kasus penggunaan khusus ini. Tapi saya punya kabar baik untuk pengembang Node.js!
Library GCS untuk Node.js mendukung penandatanganan berbasis IAM sekarang, saat diterapkan di waktu proses yang dikelola Google. Ini pada dasarnya mengimplementasikan langkah 1 dan 4 dari protokol penandatanganan baru yang digunakan oleh Firebase Admin SDK. Ini berarti developer Node.js di Google Cloud Functions dapat menggunakan layanan penuh tanpa akun sekarang. Pengembang pada bahasa lain harus menanggung ketidaknyamanan untuk saat ini, hingga perubahan yang diperlukan tersedia di pustaka GCS yang sesuai.
Kesimpulan
Saya harap posting ini memberikan pandangan sekilas tentang pembaruan baru dan penting yang diperkenalkan ke Firebase Admin SDK. Dokumentasi resmi juga mencakup banyak hal ini dan banyak lagi, jadi pastikan untuk memeriksanya juga. Kemampuan untuk menandatangani token tanpa kredensial akun layanan eksplisit adalah langkah besar untuk membuat kisah Firebase sisi server menjadi lebih baik, lebih fleksibel, dan tanpa gesekan. Tapi itu juga memiliki beberapa ruang untuk tumbuh, dan saya ingin mendengar ide dan saran Anda tentang bagaimana itu bisa sampai di sana.