Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ketika MSAL Node memperoleh token, MSAL Node menyimpannya dalam memori untuk penggunaan di masa mendatang. MSAL Node mengelola masa berlaku token dan pembaruannya untuk Anda. API seperti acquireTokenSilent() mengambil token akses dari cache untuk akun tertentu:
MSAL tidak mengekspos token refresh karena alasan keamanan. Lihat FAQ tentang cara mendapatkan token refresh.
Gunakan rahasia klien dengan aman
Rahasia klien tidak boleh dikodekan secara permanen. Paket npm dotenv dapat digunakan untuk menyimpan rahasia dalam file .env (terletak di direktori akar proyek) yang harus disertakan dalam .gitignore untuk mencegah unggahan rahasia yang tidak disengaja.
const msal = require('@azure/msal-node');
require('dotenv').config(); // process.env now has the values defined in a .env file
// Create msal application object
const cca = new msal.ConfidentialClientApplication({
auth: {
clientId: "Enter_the_Application_Id_Here", // e.g. "00001111-aaaa-2222-bbbb-3333cccc4444" (guid)
authority: "https://login.microsoftonline.com/Enter_the_Tenant_Info_Here", // e.g. "common" or your tenantId (guid)
clientSecret: process.env.clientSecret // obtained during app registration
}
});
/**
* acquireToken* APIs return an account object containing the "homeAccountId"
* you should keep a record of this in your app and use it later on when calling acquireTokenSilent
*/
const someUserHomeAccountId = "Enter_User_Home_Account_Id";
const msalTokenCache = cca.getTokenCache();
const account = await msalTokenCache.getAccountByHomeId(someUserHomeAccountId);
const silentTokenRequest = {
account: account,
scopes: ["User.Read"],
};
cca.acquireTokenSilent(silentTokenRequest).then((response) => {
// do something with response
}).catch((error) => {
// catch and handle errors
});
Di lingkungan produksi, kemungkinan besar Anda ingin menserialisasikan dan menyimpan cache token secara persisten. Bergantung pada jenis aplikasi, Anda dapat:
- Aplikasi desktop, aplikasi konsol (aplikasi klien publik (PCA)):
- Gunakan Ekstensi Node MSAL, yang menyediakan solusi persistensi dan enkripsi saat tidak aktif di Windows, Linux, dan Mac OS
- Aplikasi web, API web, aplikasi daemon (aplikasi klien rahasia (CCA)):
- Cache token dalam memori milik MSAL tidak cocok untuk produksi. Gunakan pola cache token terdistribusi untuk menyimpan cache secara persisten di media penyimpanan pilihan Anda (Redis, MongoDB, database SQL, dll. — ingat bahwa Anda dapat menggunakannya secara bersamaan, misalnya cache memori mirip Redis sebagai lapisan persistensi pertama, dan database SQL sebagai lapisan persistensi kedua yang lebih stabil)
Cache dalam memori
MSAL menyimpan cache di memori. Cache dalam memori mewakili status cache aplikasi. Masa pakai cache dalam memori sama dengan objek aplikasi MSAL. Jika proses menggunakan MSAL dimulai ulang, cache dihapus ketika siklus hidup proses selesai. Jika cache dalam memori kosong dan tidak ada cache persisten untuk memulihkan cache, pengguna harus mengautentikasi ulang. Ketika ini terjadi, jika pengguna masih memiliki sesi aktif dengan Microsoft Entra ID, mereka mungkin mengautentikasi ulang tanpa perintah apa pun, namun ini masih menurunkan pengalaman pengguna. Skenario antarlayanan (misalnya alur kredensial klien dan alur atas nama) juga mengalami kendala karena memperoleh token dari Microsoft Entra ID melibatkan permintaan HTTP dan jauh lebih lambat dibandingkan mengambil token dari cache.
Perhatikan bahwa cache dalam memori tidak dapat diskalakan untuk aplikasi sisi server dan performa akan menurun setelah menahan beberapa 100 token dalam cache. Untuk skenario aplikasi web dan API web, ini memperkirakan untuk melayani beberapa 100 pengguna. Untuk skenario aplikasi daemon yang menggunakan grant kredensial klien untuk memanggil aplikasi lain, ini berarti beberapa ratus penyewa. Lihat kinerja di bawah untuk selengkapnya.
⚠️ Sebaiknya pertahankan cache dengan enkripsi untuk semua aplikasi produksi baik untuk keamanan dan umur panjang cache yang diinginkan. Jika Anda memilih untuk tidak mempertahankan cache, antarmuka TokenCache masih tersedia untuk mengakses entitas yang di-cache.
Cache persisten
Node MSAL mengaktifkan peristiwa ketika cache dalam memori diakses dan aplikasi dapat memilih apakah akan mempertahankan cache (lihat: TokenCacheContext) (misalnya ke file, database SQL, dll.). Ini merupakan dua tindakan:
- Muat cache dari persistensi ke memori MSAL sebelum mengakses cache
- Jika cache dalam memori telah berubah sejak akses terakhir, simpan cache kembali ke persistensi
Untuk mempertahankan cache, MSAL menerima plugin cache kustom dalam konfigurasi. Plugin ini harus mengimplementasikan antarmuka ICachePlugin :
interface ICachePlugin {
beforeCacheAccess: (tokenCacheContext: TokenCacheContext) => Promise<void>;
afterCacheAccess: (tokenCacheContext: TokenCacheContext) => Promise<void>;
}
Implementasi ICachePlugin dasar antarmuka mungkin terlihat sebagai berikut (lihat juga performa dan keamanan jika Anda membangun aplikasi sisi server):
class MyCachePlugin implements ICachePlugin {
private client: ICacheClient;
constructor(client: ICacheClient) {
this.client = client; // client object to access the persistent cache
}
public async beforeCacheAccess(cacheContext: TokenCacheContext): Promise<void> {
const cacheData = await this.client.get(); // get the cache from persistence
cacheContext.tokenCache.deserialize(cacheData); // deserialize it to in-memory cache
}
public async afterCacheAccess(cacheContext: TokenCacheContext): Promise<void> {
if (cacheContext.cacheHasChanged) {
await this.client.set(cacheContext.tokenCache.serialize()); // deserialize in-memory cache to persistence
}
}
}
- Jika Anda mengembangkan aplikasi klien publik, MSAL Node Extensions menanganinya untuk Anda.
- Jika Anda mengembangkan aplikasi klien rahasia, Anda harus mempertahankan cache melalui layanan terpisah, karena satu instans cache per server tidak cocok untuk lingkungan cloud dengan banyak server dan instans aplikasi.
Kami sangat menyarankan untuk mengenkripsi cache token saat mempertahankannya pada disk. Untuk aplikasi klien publik, fitur ini tersedia secara bawaan dengan MSAL Node Extensions. Namun, untuk klien rahasia, Anda bertanggung jawab untuk merancang solusi enkripsi yang sesuai.
Performa dan keamanan
Pada aplikasi klien publik, MSAL Node Extensions memastikan performa dan keamanan untuk Anda.
Pada aplikasi klien rahasia yang menangani pengguna (aplikasi web yang memasukkan pengguna dan memanggil API web, dan API web yang memanggil API web hilir), mungkin ada banyak pengguna yang aktif secara bersamaan untuk aplikasi tertentu. Rekomendasi kami adalah membuat serialisasi satu blob cache (lihat CacheRecord) per pengguna. Ini akan membantu menskalakan cache di seluruh sistem terdistribusi. Gunakan kunci untuk mempartisi cache (yaitukunci partisi), seperti:
- Untuk aplikasi web:
<userObjectId>.<tenantId>(yaituhomeAccountId) - Untuk aplikasi daemon multitenan yang menggunakan alur pemberian kredensial klien:
<clientId>.<tenantId> - Untuk API web yang memanggil API web lain menggunakan OBO: hash dari token akses masuk (yaitu
oboAssertion) — token yang selanjutnya akan ditukarkan dengan token OBO
⚠️ Pastikan untuk melihat performa untuk informasi lebih lanjut tentang cara memantau penggunaan dan menghindari performa yang buruk.
Aplikasi web
Karena aplikasi web digunakan langsung oleh pengguna dan sering mengandalkan sesi untuk melacak setiap pengguna, kunci partisi yang sesuai untuk cache sering kali disimpan dalam data sesi dan perlu diambil terlebih dahulu sebelum pencarian di cache dapat dilakukan. Untuk membantu dengan ini, MSAL Node menyediakan kelas DistributedCachePlugin , yang mengimplementasikan ICachePlugin. Instans DistributedCachePlugin memerlukan:
- sebuah antarmuka klien (ICacheClient), yang mengimplementasikan operasi
getdansetpada server penyimpanan persisten (Redis, MySQL, dll.). - manajer partisi (IPartitionManager), untuk membaca dari dan menulis ke cache sehubungan dengan ID sesi tertentu.
Silakan merujuk ke aplikasi Web menggunakan DistributedCachePlugin untuk implementasi sampel.
Baca juga
Lihat contoh di bawah ini untuk mengetahui lebih lanjut tentang cara menangani cache dalam aplikasi MSAL Node: