Skip to content

单点登录 (SSO) 🔑

功能介绍 💡

INFO

SSO(Single Sign-On)过滤器用于实现单点登录功能,允许第三方应用通过临时 Token 安全地获取用户的登录凭证(Authorization)。

🎯 核心功能

  • 🔄 生成临时 Token - 为第三方应用生成一次性的临时访问令牌
  • ✅ 验证临时 Token - 验证令牌有效性并交换用户真实凭证
  • 🛡️ 安全防护 - 支持客户端 ID/Secret 验证、回调地址校验、防 CSRF 攻击
  • ⏱️ 时效控制 - 支持自定义 Token 过期时间

🛡️ 应用场景

  • 第三方应用接入 - 允许合作伙伴系统无缝登录
  • 多系统互联 - 集团内部不同系统间的用户免登跳转
  • 临时授权 - 给予外部系统临时的资源访问权限

详细配置说明 ⚙️

核心参数说明

application.yml 中配置 gateway.filter.sso

参数名类型必填默认值说明
enabledbooleanfalse是否启用 SSO 过滤器
rulesarray[object]-SSO 规则配置列表

规则配置详解 (rules)

参数名类型必填默认值说明
namestring-规则名称,用于日志标识
generate-urlsarray[string]-生成 Token 的接口路径列表(支持 AntPathMatcher)
verify-urlsarray[string]-验证 Token 的接口路径列表(支持 AntPathMatcher)
business-keystringbearer业务 Key,用于区分不同业务线或 Token 前缀
client-idstring-客户端 ID,用于身份识别
client-secretstring-客户端密钥,用于验证 Token 时校验身份
redirect-uristring-允许的回调地址,必须严格匹配
expirestring10m临时 Token 有效期,支持时间单位(如 5m, 1h)
response-data-authorizationbooleanfalse验证响应中是否包含授权 Token
response-data-userbooleanfalse验证响应中是否包含用户信息(ID、昵称、头像)

配置示例 📝

基础配置示例

yaml
gateway:
  filter:
    sso:
      enabled: true
      rules:
        - name: "默认SSO规则"
          generate-urls:
            - "/auth/sso/generate"
          verify-urls:
            - "/auth/sso/verify"
          business-key: "bearer"
          client-id: "my-client-id"
          client-secret: "my-client-secret"
          redirect-uri: "http://localhost:8080/callback"
          expire: "5m"
          response-data-authorization: true
          response-data-user: true

使用流程 🚀

1. 生成 SSO Token 🎫

第三方应用引导用户访问生成 Token 的接口,需携带当前用户的登录态(Authorization Header)。

  • 接口地址: 配置在 generate-urls 中的路径,例如 /auth/sso/generate
  • 请求方式: GET

请求头 (Header):

  • Authorization: 用户登录凭证(必填)

请求参数 (Query):

参数名必选说明
clientId客户端 ID,必须与配置一致
redirectUri回调地址,必须与配置一致
state随机字符串,用于防止 CSRF 攻击,原样返回

响应结果:

成功时返回 JSON,包含拼接了 codestate 的回调 URL。

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "uri": "http://localhost:8080/callback?code=bearer:uuid&state=xyz"
  }
}

2. 验证 SSO Token 🔐

第三方应用在回调地址接收到 code 后,调用验证接口换取用户的 Authorization。

  • 接口地址: 配置在 verify-urls 中的路径,例如 /auth/sso/verify
  • 请求方式: GET

请求参数 (Query):

参数名必选说明
clientId客户端 ID
clientSecret客户端密钥
code第一步获取到的临时 Token

响应结果:

成功时返回用户的 Authorization 和用户信息(根据配置)。

json
{
  "code": 0,
  "msg": "success",
  "data": {
    "authorization": "Bearer eyJhbGciOiJIUzI1Ni...",
    "userId": "123456",
    "nickname": "Admin",
    "avatarUrl": "http://example.com/avatar.jpg"
  }
}

常见问题 ❓

  1. 为什么验证 Token 失败?

    • 检查 clientSecret 是否正确。
    • 检查 code 是否已过期(默认 10 分钟)。
    • 检查 code 是否已被使用过(Token 是一次性的)。
  2. redirectUri 报错?

    • 回调地址必须与配置文件中的 redirect-uri 完全一致(包括 http/https 协议和端口)。
  3. state 参数的作用?

    • 建议始终携带 state 参数(如随机字符串),并在回调时验证,以防止跨站请求伪造(CSRF)攻击。