Узел MSAL — в кеше памяти всегда пусто при использовании ConfidentialClientApplication.acquireTokenByClientCredential.

Я использую узел msal последней версии. Это мой код:

       protected getConfidentialClientApplication(tenantId: string): ConfidentialClientApplication {
        if (this.confidentialClientApplication) {
            return this.confidentialClientApplication;
        }

        this.confidentialClientApplication = new ConfidentialClientApplication({
            auth: {
                clientId: this.tokenConfiguration.clientId,
                clientCertificate: {
                    thumbprint: this.tokenConfiguration.thumbprint,
                    privateKey: this.tokenConfiguration.privateKey,
                    x5c: this.tokenConfiguration.publicKey
                },
                authority: this.tokenConfiguration.authority + tenantId,
                knownAuthorities: [this.tokenConfiguration.authority + tenantId]
            },
        });

        return this.confidentialClientApplication;
    }

protected getTokenRequest(correlationId: string): ClientCredentialRequest {
    return {
        scopes: this.getScopes(),
        correlationId: correlationId,
        azureRegion: "TryAutoDetect"
    };
}

и я вызываю этот метод:

      this.getConfidentialClientApplication(tenantId).acquireTokenByClientCredential(tokenRequest)

Если я наблюдаю за ответом на запрос, токен существует, но учетная запись пуста. Также,msalTokenCache.getAllAccounts(); всегда пустой список. Как решить?

1 ответ

В соответствии с потоками аутентификации Document-msal с использованием учетных данных клиента

Для потока учетных данных клиента, где вы получаете токены без взаимодействия с пользователем, важно понимать, что обычно учетные записи пользователей не используются.

Поток учетных данных клиента предназначен для связи между серверами и не касается учетных записей пользователей или взаимодействия с ними.

Когда вы используете поток учетных данных клиента для получения токена, не будет никаких кэшированных учетных записей, которые можно было бы получить с помощьюmsalTokenCache.getAllAccounts().

Вот пример того, как вы можете это сделать:

      const { ConfidentialClientApplication , PublicClientApplication} =  require("@azure/msal-node");            
const  tenantId  =  "********-****-****-****-***********";   
const  tokenConfiguration  = {
clientId:  "********-****-****-****-***********", 
clientSecret:  "**********************************", // Add your client secret here   
authority:  "https://login.microsoftonline.com/",  
};    
const  confidentialClientApplication  =  new  ConfidentialClientApplication({    
auth: {   
clientId:  tokenConfiguration.clientId,  
clientSecret:  tokenConfiguration.clientSecret,   
authority:  tokenConfiguration.authority  +  tenantId,    
knownAuthorities: [tokenConfiguration.authority  +  tenantId]   
}    
});
  
const  tokenRequest  = {    
scopes: [`${tokenConfiguration.clientId}/.default`], // Replace with the scope you need  
azureRegion:  "TryAutoDetect" 
}; 
(async () => {  
try { 
const  response  =  await  confidentialClientApplication.acquireTokenByClientCredential(tokenRequest);
console.log("Token response:", response);
const  cachedAccounts  =  await  confidentialClientApplication.getTokenCache().getAllAccounts();

console.log("Cached accounts:", cachedAccounts);

} catch (error) {

console.error("Token acquisition error:", error);

}

})();

Ответ:

введите сюда описание изображения

Другие вопросы по тегам