OAuth2授权码流程(msal.js)清除本地状态后静默登录的原理探究
解答你的MSAL.js静默登录疑问
这个问题的核心在于浏览器与微软身份平台之间的会话并未被你清除的本地状态所影响,下面我一步步拆解这个流程:
1. 关键:微软身份平台的会话Cookie是核心
当你第一次登录时,login.microsoftonline.com会在你的浏览器中设置会话Cookie(通常是ESTSAUTH系列的Cookie),这个Cookie是用来标识你与微软身份服务器之间的已登录会话的。你清除的本地存储、缓存、JS内存,都是属于你自己的应用域名下的数据,并不会清除login.microsoftonline.com域名下的Cookie——而这个第三方Cookie才是微软服务器识别你身份的关键。
2. 静默登录时的code与code_verifier如何生成/获取
当你清除本地状态后刷新页面,MSAL.js重新初始化,此时发起静默登录请求的流程是这样的:
- MSAL.js会重新生成一组新的PKCE参数:
code_verifier(随机生成的字符串)和对应的code_challenge(用SHA-256哈希处理后的code_verifier)。 - 它会在后台发起一个到
https://login.microsoftonline.com/redacted/oauth2/v2.0/authorize的请求,携带prompt=none(表示静默登录)、code_challenge、client_id等参数,同时浏览器会自动带上login.microsoftonline.com的会话Cookie。 - 微软服务器验证Cookie后,确认你已经登录过且会话有效,就会返回一个新的授权码
code到你的应用回调地址(单页应用通常用response_mode=fragment传递)。 - 最后,MSAL.js用刚才生成的
code_verifier加上返回的code,调用https://login.microsoftonline.com/redacted/oauth2/v2.0/token接口换取Access Token——因为服务器之前已经收到了对应的code_challenge,验证匹配后就会颁发Token。
3. 不同场景的差异原因
需要重新输入凭据的场景
- 隐私/隐身标签页:这类标签页会隔离Cookie,不会共享普通标签页的会话Cookie,所以微软服务器无法识别你的身份。
- 关闭浏览器后重新打开:如果你的浏览器设置了“关闭时清除所有Cookie”,那么
login.microsoftonline.com的会话Cookie会被清除,服务器就没有你的登录记录了。 - 不同浏览器:Cookie是浏览器隔离的,每个浏览器的Cookie存储是独立的,所以其他浏览器没有你的登录会话Cookie。
无需重新输入凭据的场景
- 同一浏览器新标签页/新窗口:它们共享同一个浏览器的Cookie存储,
login.microsoftonline.com的会话Cookie仍然有效,服务器能识别你的身份。 - 刷新标签并清除状态后登录:你清除的是应用本地的存储,并没有清除微软域名下的会话Cookie,所以服务器依然能通过Cookie确认你的身份,完成静默登录。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

