Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När MSAL Node hämtar en token cachelagrar den i minnet för framtida användning. MSAL Node hanterar tokens livslängd och uppdaterar åt dig. API:er som acquireTokenSilent() hämtar åtkomsttoken från cachen för ett visst konto:
MSAL exponerar inte uppdateringstoken av säkerhetsskäl. Se Vanliga frågor och svar om hur du hämtar uppdateringstoken.
Använda klienthemligheter på ett säkert sätt
Klienthemligheter bör aldrig hårdkodas. Dotenv npm-paketet kan användas för att lagra hemligheter i en .env-fil (finns i projektets rotkatalog) som ska ingå i .gitignore för att förhindra oavsiktliga uppladdningar av hemligheterna.
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
});
I en produktionsmiljö vill du troligen serialisera och lagra tokencachen. Beroende på typ av program kan du:
- Skrivbordsappar, konsolappar (offentliga klientappar (PCA)):
- Använd MSAL Node Extensions, som tillhandahåller beständighet och kryptering i vila lösningar på Windows, Linux och Mac OS
- Webbappar, webb-API:er, daemonappar (konfidentiella klientappar (CCA)):
- MSAL:s token-cache i minnet fungerar inte i stor skala i produktion. Använd cachelagringsmönstret för distribuerad token för att spara cacheminnet i din val av lagringsmiljö (Redis, MongoDB, SQL-databaser osv. -keep i åtanke att du kan använda dessa tillsammans , t.ex. en Redis-liknande minnescache som ett första lager av beständighet och en SQL-databas som ett andra, stabilare beständighetslager)
Minnescache
MSAL har en cache i minnet. Minnesintern cache är representativ för programmets cachetillstånd. Livslängden för minnesintern cache är samma som MSAL-programobjektet. Om processen med MSAL startas om raderas cacheminnet när processlivscykeln är klar. Om cacheminnet i minnet är tomt och det inte finns någon beständig cache att återställa cacheminnet från måste användarna autentisera igen. Om användaren fortfarande har en aktiv session med Microsoft Entra ID kan det hända att användaren autentiseras igen utan några uppmaningar, men detta försämrar fortfarande användarupplevelsen. Tjänst-till-tjänst-scenarier (d.v.s. klientautentiseringsflödet och on-behalf-of-flödet) påverkas också, eftersom det krävs HTTP-begäranden för att hämta en token från Microsoft Entra ID, och det är mycket långsammare än att hämta en token från cacheminnet.
Observera att minnesintern cache inte är skalbar för program på serversidan och att prestandan försämras efter att ha lagrat några 100 token i cacheminnet. För webbapps- och webb-API-scenarier uppskattas detta till att betjäna några 100 användare. För daemon-appscenarier som använder klientautentiseringsuppgifter för att anropa andra appar innebär det några 100 klientorganisationer. Mer information finns i prestanda nedan.
⚠️ Vi rekommenderar att cacheminnet bevaras med kryptering för alla produktionsprogram både för säkerhet och önskad cachelivslängd. Om du väljer att inte spara cachen är TokenCache-gränssnittet fortfarande tillgängligt för åtkomst till de cachelagrade entiteterna.
Beständig cache
MSAL Node utlöser händelser när minnesintern cache används och appar kan välja om cacheminnet ska sparas (se: TokenCacheContext) (t.ex. till en fil, en SQL-databas och så vidare). Detta utgör två åtgärder:
- Läs in cacheminnet från den beständiga lagringen till MSAL:s minne innan du använder cacheminnet
- Om minnesintern cache har ändrats sedan den senaste åtkomsten sparar du cachen tillbaka till beständighet
För att spara cacheminnet accepterar MSAL ett anpassat cache-plugin-program i konfigurationen. Det här plugin-programmet bör implementera ICachePlugin-gränssnittet :
interface ICachePlugin {
beforeCacheAccess: (tokenCacheContext: TokenCacheContext) => Promise<void>;
afterCacheAccess: (tokenCacheContext: TokenCacheContext) => Promise<void>;
}
En grundläggande implementering av ICachePlugin gränssnittet kan se ut så här (se även prestanda och säkerhet om du skapar en app på serversidan):
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
}
}
}
- Om du utvecklar en offentlig klientapp hanterar MSAL Node Extensions detta åt dig.
- Om du utvecklar en konfidentiell klientapp bör du spara cachen via en separat tjänst, eftersom en enda cacheinstans per server inte är lämplig för en molnmiljö med många servrar och appinstanser.
Vi rekommenderar starkt att du krypterar tokencachen när den sparas på disken. För offentliga klientappar erbjuds detta färdigt från början med MSAL Node Extensions. För konfidentiella klienter ansvarar du dock för att utforma en lämplig krypteringslösning.
Prestanda och säkerhet
I offentliga klientappar garanterar MSAL Node Extensions prestanda och säkerhet för dig.
På konfidentiella klientappar som hanterar användare (webbappar som loggar in användare och anropar webb-API:er och webb-API:er som anropar underordnade webb-API:er) kan det finnas många användare som är aktiva samtidigt för ett visst program. Vår rekommendation är att serialisera en cacheblob (se CacheRecord) per användare. Detta skulle hjälpa dig att skala cachen i ett distribuerat system. Använd en nyckel för att partitionera cachen (t.ex.partitionsnyckeln), till exempel:
- För webbappar:
<userObjectId>.<tenantId>(d.v.s.homeAccountId) - För daemonappar för flera klientorganisationer som använder klientautentiseringsuppgifter beviljar:
<clientId>.<tenantId> - För webb-API:er som anropar andra webb-API:er med OBO: hashvärdet för den inkommande åtkomsttokenen (d.v.s.
oboAssertion) – tokenen som därefter kommer att bytas ut mot en OBO-token
⚠️ Se till att se prestanda för mer information om hur du övervakar användningen och undviker dåliga prestanda.
Webbappar
Eftersom webbappar är användarriktade och ofta förlitar sig på sessioner för att hålla reda på varje användare, lagras lämplig partitionsnyckel för cachelagring ofta i sessionsdata och måste hämtas innan cachesökningen kan äga rum. För att hjälpa till med detta tillhandahåller MSAL Node klassen DistributedCachePlugin , som implementerar ICachePlugin. En instans av DistributedCachePlugin kräver:
- ett klientgränssnitt (ICacheClient) som implementerar
get- ochset-operationer på lagringsservern (Redis, MySQL osv.). - en partitionshanterare (IPartitionManager) för att läsa från och skriva till cache med avseende på ett visst sessions-ID.
Se webbappen med DistributedCachePlugin för en exempelimplementering.
Se även
Mer information om hur du hanterar cachelagring i MSAL Node-appar finns i exemplen nedan: