SSO登录后前端如何安全获取并存储用户信息?
我们接入了公司统一的SSO系统,登录成功后会跳转回前端页面并带上code参数。现在的问题是:我该在前端怎么拿这个code换用户信息?直接用axios发请求到后端接口可以吗?而且拿到用户信息后存localStorage会不会有安全风险?
目前我在入口页面这样处理跳转后的URL:
<script>
const urlParams = new URLSearchParams(window.location.search);
const code = urlParams.get('code');
if (code) {
// 清除url中的code,避免刷新重复使用
window.history.replaceState({}, document.title, window.location.pathname);
// 调用后端接口换取用户信息
fetch('/api/auth/sso?code=' + code)
.then(res => res.json())
.then(user => localStorage.setItem('user', JSON.stringify(user)));
}
</script>
但总觉得这样不太对,好像把敏感逻辑放前端了,求指点正确做法。
SSO的标准流程就是前端拿code → 发给后端 → 后端去换token和用户信息 → 返回给前端。你那段代码里,前端只是把code传过去,实际换token的逻辑是在后端完成的,所以不存在把敏感逻辑放前端的问题。
但有几个点要注意一下:
后端那边一定要保证code只能使用一次,用完就失效,不然有重放攻击风险。另外后端返回给前端的用户信息应该是脱敏后的,比如只需要用户ID、昵称、头像这些,别把token啊、敏感字段啊返回来。
关于localStorage存用户信息,确实有XSS风险,但如果你们没有XSS漏洞那就没问题。这是前端存用户状态的常见做法,比存cookie更安全一点(cookie有CSRF问题)。如果想更安全,可以考虑:
用sessionStorage代替localStorage,关闭浏览器就清掉
或者存一个加密后的用户信息,后端返回时做个简单加密
关键是把token存httpOnly的cookie里,别存localStorage,前端只存用户基本信息
你现在的实现没大问题,把心放肚子里。唯一建议优化的是fetch请求可以加个错误处理 万一后端换用户信息失败了不至于静默失败。