MSAL Java新acquireTokenSilent方法报401错误,旧方法正常
解决MSAL新版
acquireTokenSilent账户不匹配问题 你遇到的问题核心是新版AcquireTokenSilentParameters要求明确绑定当前已登录的账户,且参数中的authority必须和登录时完全一致,以下是具体修正步骤:
1. 必须传入当前已登录的账户
旧版acquireTokenSilent会自动关联当前登录账户,但新版Builder模式需要显式指定。调用前需通过ISingleAccountPublicClientApplication的getCurrentAccount()获取当前账户,传入AcquireTokenSilentParameters.Builder的account()方法。
示例Kotlin代码:
// 获取当前登录账户 val currentAccount = singleAccountApp.getCurrentAccount()?.account ?: throw IllegalStateException("No account signed in") // 构建静默获取令牌参数 val silentParams = AcquireTokenSilentParameters.builder() .scopes(scopes) .account(currentAccount) // 关键:必须传入当前登录账户 .authority(authority) // 必须和登录时使用的authority一致 .callback(object : AuthenticationCallback { override fun onSuccess(authenticationResult: IAuthenticationResult) { // 处理令牌 } override fun onError(exception: MsalException) { // 处理错误,比如触发交互式登录 } override fun onCancel() { // 取消操作处理 } }) .build() // 调用静默获取令牌 singleAccountApp.acquireTokenSilent(silentParams)
2. 确保Authority完全一致
登录时SignInParameters中设置的authority,必须和AcquireTokenSilentParameters中的authority完全匹配:
- 不能出现登录用
https://login.microsoftonline.com/common、静默获取用https://login.microsoftonline.com/{tenant-id}的情况 - 注意域名、租户ID、路径的大小写和拼写,任何不一致都会触发账户不匹配错误
3. 排查其他潜在问题
- 检查登录后是否执行过
signOut或账户切换操作:SingleAccount模式下同一时间仅能有一个账户登录,需确认getCurrentAccount()返回的账户有效性 - 清理缓存重试:若存在旧缓存数据干扰,可调用
singleAccountApp.removeAccount(currentAccount)后重新登录,再尝试静默获取令牌
内容的提问来源于stack exchange,提问作者Roar Grønmo
相关产品推荐
相关产品推荐

