MSAL.js中ssoSilent()与acquireTokenSilent()的差异及适用场景
MSAL.js中
ssoSilent()与acquireTokenSilent()的区别及适用场景 核心差异
1. 定位与核心目标
ssoSilent():是静默登录工具,核心是借助浏览器中已存在的Azure AD会话(比如用户在同浏览器的其他应用已登录),无需用户操作完成身份验证,同时返回账户和令牌。它的核心逻辑是"建立/恢复用户会话",令牌是附带结果。acquireTokenSilent():是静默令牌获取/刷新工具,核心是为已经完成登录的用户获取访问令牌,前提是本地已有该用户的账户信息。它的核心逻辑是"拿令牌调用API",完全依赖已存在的本地账户。
2. 账户参数要求
ssoSilent():不需要传入Account参数。它会自动检测浏览器内的SSO会话,匹配应用的租户/客户端ID,自动创建并返回账户对象;如果没有有效会话,会抛出interaction_required错误。acquireTokenSilent():必须传入Account参数(特殊场景可用loginHint替代,但常规场景必须指定)。它只会针对指定账户,从本地缓存取令牌或用刷新令牌换新令牌,不会主动检测跨标签页的SSO会话。
3. 缓存与会话逻辑
ssoSilent():执行时会主动向Azure AD发起请求验证会话,成功后将账户和令牌存入MSAL本地缓存;如果本地已有账户,也会同步更新令牌信息。acquireTokenSilent():优先读取本地缓存的有效令牌,缓存过期才会用刷新令牌换新令牌;不会主动触发Azure AD的会话验证,只有刷新令牌失效时才会报错。
适用场景
用ssoSilent()的场景
- 应用初始化自动登录:打开应用时,自动识别用户是否已在浏览器登录过同租户的其他应用,无需点击登录按钮即可进入应用。
- 跨应用/标签页SSO:用户在A应用登录后,打开同浏览器的B应用,B应用调用
ssoSilent()就能自动获取会话完成登录。 - 恢复中断的会话:用户关闭标签页重开应用,用
ssoSilent()快速恢复登录状态,不用重新输凭据。
用acquireTokenSilent()的场景
- 调用API前拿令牌:用户已登录后,每次调用受保护API前,用它从缓存取有效令牌,缓存失效自动刷新,保证API授权正常。
- 指定账户的令牌管理:本地有多个账户时,精准指定某一账户获取对应令牌。
- 令牌提前刷新:在令牌过期前调用,提前刷新避免API调用失败。
误区澄清
你觉得acquireTokenSilent()能完成全部工作,是有前提的:只有本地已有账户缓存时,它才能正常获取令牌;如果本地无账户(比如首次打开应用、缓存被清空),它会直接报错,无法触发SSO会话检测。而ssoSilent()的核心价值就是在本地无账户时,通过浏览器的SSO会话获取账户和令牌,完成登录流程。
内容的提问来源于stack exchange,提问作者Jake_3H
相关产品推荐
相关产品推荐

