Узел 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);
}
})();
Ответ: