使用msal-node通过刷新令牌获取访问令牌时触发AADSTS700025错误
错误原因
AADSTS700025的核心问题是:你的Azure AD应用被配置为公共客户端(比如SPA、移动应用、桌面应用这类无法安全存储密钥的应用),但代码里误用了ConfidentialClientApplication——这个类是给机密客户端(后端服务、Web应用)设计的,它会默认尝试携带客户端凭证(client_secret或client_assertion),而公共客户端的认证流程明确禁止提交这类凭证,因此Azure AD直接拒绝了请求。
解决方法
确认Azure AD应用类型
登录Azure门户找到你的应用注册,进入「认证」页面,在「高级设置」里查看「允许公共客户端流」的状态:如果设为「是」,说明这是公共客户端,必须用对应MSAL类处理。替换MSAL客户端类
将代码中的ConfidentialClientApplication替换为PublicClientApplication——这是MSAL专为公共客户端提供的类,不会自动携带客户端凭证,适配公共客户端的认证规则。清理配置中的机密项
检查你的msalConfig,确保里面没有clientSecret这类属于机密客户端的配置字段,公共客户端只需要clientId、authority等基础配置项。
修改后的代码示例
if(createEventResponse === undefined){ console.log("token-expired") const scopes = ["https://graph.microsoft.com/user.read"]; // 替换为PublicClientApplication const pca = new PublicClientApplication(msalConfig); pca.acquireTokenByRefreshToken({ refreshToken: refreshToken, scopes: scopes, }) .then((response) => { console.log(response) const newAccessToken = response.accessToken; console.log('New Access token:', newAccessToken); // 后续业务操作 }) .catch((error) => { console.error('Token acquisition error:', error); }); }
额外说明
如果你的服务本质是机密客户端(比如后端Web应用),那需要去Azure门户将应用的「允许公共客户端流」设为「否」,同时确保msalConfig中正确配置clientSecret或客户端证书,继续使用ConfidentialClientApplication即可。
内容的提问来源于stack exchange,提问作者Tejas Sanjay Chaudhari

