单点登录是什么?
你有没有这样的经历:早上打开电脑,先登录公司内网系统,再进邮箱、OA、考勤系统,每个都要输一遍账号密码。要是能一次登录,所有系统都自动认出来该多好?这其实就是单点登录(Single Sign-On,简称 SSO)要解决的问题。
简单说,单点登录就是用户在一个系统里登录后,再访问其他关联系统时,不用重复输入账号密码,系统会自动识别身份。
SSO 的核心思路
要做到一次登录处处通行,关键在于“信任”和“凭证传递”。就像你在酒店前台登记完,拿一张房卡,凭这张卡可以进出房间、健身房、餐厅。各个地方都认可这张卡的有效性,不需要你每次都出示身份证。
在技术上,这个“房卡”通常是一个加密的令牌(Token),比如 JWT(JSON Web Token)。用户首次登录认证中心后,系统生成一个令牌,之后访问其他系统时,把这个令牌带上,目标系统验证通过就放行。
常见的实现方式:基于 OAuth 2.0 和 JWT
现在大多数 SSO 方案都基于 OAuth 2.0 协议。举个例子:你想用微信登录某网站,点击“微信登录”按钮后,网站把你跳转到微信的登录页。你输入账号密码后,微信返回一个授权码给网站,网站再用这个码去换一个访问令牌(Access Token)。
这个令牌里包含了你的用户信息,比如 openid、昵称、头像等,网站拿到后就知道你是谁,完成登录。
<!-- 示例:OAuth 2.0 授权码流程 -->
/authorize?response_type=code&client_id=your_client_id&redirect_uri=callback_url&scope=user_info
// 用户同意后,重定向并携带 code
https://your-site.com/callback?code=AUTH_CODE
// 网站后端用 code 换取 access_token
POST /token HTTP/1.1
Host: api.weixin.qq.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=AUTH_CODE&client_id=...&client_secret=...JWT 如何用于 SSO
JWT 是一种自包含的令牌格式,由三部分组成:头部、载荷、签名。载荷里可以存放用户 ID、过期时间等信息,签名用来防篡改。
认证中心签发 JWT 后,浏览器将其存入 Cookie 或 localStorage。后续请求中,前端自动附加这个令牌到请求头:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx各个业务系统接收到请求后,用相同的密钥验证签名,解析出用户信息,无需查数据库,效率高。
实际部署中的注意事项
跨域问题是个常见坑。如果各个系统的域名不同,Cookie 默认不会共享。这时候可以用中央认证服务部署在独立域名下(如 sso.company.com),通过 iframe 或重定向方式统一处理登录状态。
安全性也不能忽视。令牌必须设置合理过期时间,支持主动注销机制。虽然 JWT 本身无状态,但可以通过维护黑名单或短期令牌+刷新机制来控制登出。
另外,企业内部常用 SAML 协议做 SSO,尤其在传统 IT 架构中。而互联网产品更倾向使用 OAuth 2.0 + OpenID Connect,接入方便,移动端支持好。