Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Když uzel MSAL získá token, uloží ho do mezipaměti pro budoucí využití. MSAL pro Node.js za vás spravuje životnost a obnovování tokenů. Rozhraní API, jako je acquireTokenSilent(), načítají přístupové tokeny z mezipaměti pro daný účet:
Knihovna MSAL nezpřístupňuje obnovovací tokeny z bezpečnostních důvodů. Informace o získání obnovovacích tokenů najdete v nejčastějších dotazech .
Bezpečné používání tajných kódů klienta
Tajné kódy klienta by nikdy neměly být pevně zakódované. Balíček dotenv npm lze použít k ukládání tajných kódů do souboru .env (umístěného v kořenovém adresáři projektu), který by měl být součástí souboru .gitignore , aby se zabránilo náhodnému nahrání tajných kódů.
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
});
V produkčním prostředí byste pravděpodobně chtěli serializovat a zachovat mezipaměť tokenů. V závislosti na typu aplikace můžete:
- Desktopové aplikace, konzolové aplikace (veřejné aplikace klientů (PCA)):
- Použijte MSAL Node Extensions, které poskytuje řešení pro trvalé uchovávání a šifrování uložených dat v systémech Windows, Linux a Mac OS
- Webové aplikace, webová rozhraní API, aplikace démona (důvěrné klientské aplikace (CCA)):
- Mezipaměť tokenů MSAL v paměti není škálovatelná pro produkční prostředí. Pomocí vzoru ukládání distribuovaných tokenů do mezipaměti uchovávejte mezipaměť ve zvoleném prostředí úložiště (Redis, MongoDB, databáze SQL atd. -keep mějte na paměti, že je můžete použít společně , například mezipaměť paměti podobná Redis jako první vrstvu trvalosti, a databázi SQL jako druhou, stabilnější vrstvu trvalosti).
Mezipaměť v operační paměti
MSAL udržuje mezipaměť v paměti. Mezipaměť v paměti představuje stav mezipaměti aplikace. Životnost mezipaměti v paměti je stejná jako objekt aplikace MSAL. Pokud se proces používající MSAL restartuje, mezipaměť se po dokončení životního cyklu procesu vymaže. Pokud je mezipaměť v operační paměti prázdná a neexistuje žádná trvalá mezipaměť, ze které by ji bylo možné obnovit, uživatelé se budou muset znovu ověřit. Pokud k tomu dojde, pokud má uživatel stále aktivní relaci s Microsoft Entra ID, může se znovu ověřit bez jakýchkoli výzev, ale to stále snižuje uživatelské prostředí. Scénáře service-to-service (tj. tok přihlašovacích údajů klienta, on-behalf-of flow) také trpí, protože získání tokenu z Microsoft Entra ID zahrnuje požadavky HTTP a je mnohem pomalejší než získání tokenu z mezipaměti.
Mějte na paměti, že mezipaměť v paměti není škálovatelná pro aplikace na straně serveru a výkon se sníží po uložení několika 100 tokenů v mezipaměti. V případě scénářů webové aplikace a webového rozhraní API je to přibližné pro obsluhu několika 100 uživatelů. V případě scénářů démona, které používají přihlašovací údaje klienta pro volání jiných aplikací, to znamená několik 100 tenantů. Další informace najdete níže v části výkon.
⚠✔ Doporučujeme zachovat mezipaměť s šifrováním pro všechny produkční aplikace jak pro zabezpečení, tak i požadovanou životnost mezipaměti. Pokud se rozhodnete neuchovávat mezipaměť, je rozhraní TokenCache stále k dispozici pro přístup k entitě v mezipaměti.
Trvalá mezipaměť
Uzel MSAL aktivuje události při přístupu do mezipaměti v paměti a aplikace můžou zvolit, jestli se má mezipaměť zachovat (viz : TokenCacheContext) (např. do souboru, databáze SQL atd.). Jedná se o dvě akce:
- Načtěte mezipaměť z trvalého úložiště do paměti MSAL před přístupem k mezipaměti
- Pokud se mezipaměť v paměti od posledního přístupu změnila, uložte mezipaměť zpět na trvalost.
Pro trvalé ukládání mezipaměti podporuje MSAL v configuration vlastní modul plug-in pro mezipaměť. Tento modul plug-in by měl implementovat rozhraní ICachePlugin :
interface ICachePlugin {
beforeCacheAccess: (tokenCacheContext: TokenCacheContext) => Promise<void>;
afterCacheAccess: (tokenCacheContext: TokenCacheContext) => Promise<void>;
}
Základní implementace ICachePlugin rozhraní může vypadat následovně (pokud vytváříte aplikaci na straně serveru, podívejte se také na výkon a zabezpečení ):
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
}
}
}
- Pokud vyvíjíte veřejnou klientskou aplikaci, rozšíření uzlů MSAL to za vás zvládnou.
- Pokud vyvíjíte důvěrnou klientskou aplikaci, měli byste mezipaměť uchovávat prostřednictvím samostatné služby, protože jedna instance mezipaměti na server není vhodná pro cloudové prostředí s mnoha servery a instancemi aplikací.
Při zachování na disku důrazně doporučujeme zašifrovat mezipaměť tokenů. U veřejných klientských aplikací je tato funkce k dispozici ve výchozím nastavení prostřednictvím rozšíření MSAL Node Extensions. Pro důvěrné klienty však zodpovídáte za vytvoření vhodného řešení šifrování.
Výkon a zabezpečení
U veřejných klientských aplikací zajišťuje rozšíření MSAL Node Extensions výkon a zabezpečení za vás.
U důvěrných klientských aplikací, které zpracovávají uživatele (webové aplikace, které přihlašují uživatele a volají webová rozhraní API a webová rozhraní API volající podřízená webová rozhraní API), může být pro danou aplikaci současně aktivních mnoho uživatelů. Naším doporučením je serializovat jeden objekt blob mezipaměti (viz CacheRecord) na uživatele. To by pomohlo se škálováním mezipaměti napříč distribuovaným systémem. Použijte klíč k rozdělení mezipaměti na oddíly (tj.klíč oddílu), například:
- Pro webové aplikace:
<userObjectId>.<tenantId>(tj.homeAccountId) - Pro aplikace démona s více tenanty pomocí udělení přihlašovacích údajů klienta:
<clientId>.<tenantId> - Pro webová rozhraní API, která volají jiná webová rozhraní API pomocí OBO: hodnota hash příchozího přístupového tokenu (tj.
oboAssertion) – token, který bude následně vyměněn za token OBO.
⚠️ Nezapomeňte si přečíst informace o výkonu, kde najdete další informace o tom, jak monitorovat využití a předejít problémům s výkonem.
Webové aplikace
Vzhledem k tomu, že webové aplikace jsou přístupné uživatelům a často se spoléhají na relace, aby bylo možné sledovat jednotlivé uživatele, příslušný klíč oddílu pro ukládání do mezipaměti se často ukládá v datech relace a je potřeba ho načíst předtím, než bude možné vyhledávání mezipaměti provést. K tomu poskytuje uzel MSAL třídu DistributedCachePlugin , která implementuje ICachePlugin. Instance DistributedCachePlugin vyžaduje:
-
klientské rozhraní (ICacheClient), které na serveru perzistence (Redis, MySQL atd.) implementuje operace
getaset. - správce oddílů (IPartitionManager) pro čtení z mezipaměti a zápis do mezipaměti s ohledem na dané ID relace.
Ukázkovou implementaci najdete ve webové aplikaci využívající DistributedCachePlugin .
Viz také
Další informace o tom, jak zpracovávat ukládání do mezipaměti v aplikacích MSAL Node, najdete v následujících ukázkách: