前言
大家好,我是老马。
今天我们来一起讨论下 sso 系统应该设计哪些核心的接口能力?
项目
前后端合一:
前后端分离:
需求
提供核心的接口能力。
保证对所有的接入方进行本身的权限验证。
核心能力
登录
-
接口路径:
POST /api/login
- 请求参数:
{ "username": "user@example.com", "password": "hashed_password", "captcha": "captcha_token", // 如果需要验证码 "verification_code": "123456" // 二次验证时(如短信/邮件验证码) }
-
响应示例:
{ "status": "success", "token": "jwt_token_or_session_token", "message": "登录成功" }
登出
功能: 提供用户注销会话、清除认证信息的接口。
接口设计:
-
接口路径:
POST /api/logout
-
请求参数:
{ "token": "jwt_token_or_session_token" // 要注销的会话令牌 }
-
响应示例:
{ "status": "success", "message": "登出成功" }
token 验证
功能: 提供验证认证令牌有效性的接口,确保令牌未过期且未撤销。
接口设计:
-
接口路径:
POST /api/token/validate
- 请求参数:
{ "token": "jwt_token_or_session_token" }
-
响应示例:
{ "status": "valid", "message": "令牌有效" }
用户信息获取
功能: 提供已认证用户的基本信息。
接口设计:
-
接口路径:
GET /api/user/info
-
请求参数:
{ "token": "jwt_token_or_session_token" }
-
响应示例:
{ "user_id": 123456, "first_name": "John", "last_name": "Doe", "email": "user@example.com", "phone_number": "1234567890", "status": "active" }
chat
不同登录方式的兼容
如果您的 SSO 系统需要支持多种登录方式(如账号密码登录、OTP(一次性密码)、 多因子验证(如 Google 动态码), 接口设计需要能够灵活地处理这些不同的认证方式。
以下是针对多种登录方式的接口设计方案:
1. 账号密码登录接口
功能: 用户通过用户名和密码进行登录。
接口设计:
- 接口路径:
POST /api/login/password
- 请求参数:
{ "username": "user@example.com", "password": "hashed_password" }
- 响应示例:
{ "status": "success", "message": "登录成功", "token": "jwt_token_or_session_token", "requires_otp": true // 如果需要 OTP 进一步验证 }
2. OTP 验证接口
功能: 用户通过短信、邮箱等方式接收 OTP,并验证 OTP 是否正确。
接口设计:
- 接口路径:
POST /api/otp/send
- 请求参数:
{ "username": "user@example.com", "otp_method": "sms" // 也可以是 "email" }
- 响应示例:
{ "status": "success", "message": "OTP 已发送" }
- 接口路径:
POST /api/otp/verify
- 请求参数:
{ "username": "user@example.com", "otp": "123456" }
- 响应示例:
{ "status": "success", "message": "OTP 验证通过", "token": "jwt_token_or_session_token" }
3. Google 动态码(TOTP)验证接口
功能: 用户通过 Google Authenticator 或其他支持 TOTP(基于时间的一次性密码)的应用来获取动态验证码进行验证。
接口设计:
- 接口路径:
POST /api/mfa/enable
- 请求参数:
{ "username": "user@example.com" }
- 响应示例:
{ "status": "success", "message": "多因子验证已启用", "secret": "base32_encoded_secret", // 提供给用户用于 Google Authenticator 扫描的密钥 "qr_code_url": "https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=otpauth://totp/MyApp:user@example.com?secret=base32_encoded_secret" }
- 接口路径:
POST /api/mfa/verify
- 请求参数:
{ "username": "user@example.com", "totp": "123456" // 用户通过 Google Authenticator 获取的验证码 }
- 响应示例:
{ "status": "success", "message": "多因子验证通过", "token": "jwt_token_or_session_token" }
4. 统一登录接口(支持多种认证方式)
功能: 提供一个统一的入口,根据不同的认证方式选择相应的验证流程,支持账号密码、OTP、Google 动态码等。
接口设计:
- 接口路径:
POST /api/login
- 请求参数:
{ "username": "user@example.com", "password": "hashed_password", "otp": "123456", // 如果是 OTP 登录 "totp": "123456", // 如果是多因子验证 "auth_method": "password" // 认证方式:password, otp, mfa }
- 响应示例:
{ "status": "success", "message": "登录成功", "token": "jwt_token_or_session_token", "requires_otp": false, "requires_mfa": false // 如果已经登录不再需要 OTP 或 MFA }
5. 登出接口
功能: 提供登出功能,注销会话。
接口设计:
- 接口路径:
POST /api/logout
- 请求参数:
{ "token": "jwt_token_or_session_token" }
- 响应示例:
{ "status": "success", "message": "登出成功" }
总结
通过上面的设计,您的 SSO 系统支持不同的认证方式,可以灵活应对多种登录场景。以下是各方式的简要说明:
- 账号密码登录: 用户直接通过用户名和密码登录,适用于基础认证。
- OTP 验证: 用户登录后,可以选择通过短信、邮件等方式接收一次性密码,增强安全性。
- 多因子验证(Google 动态码): 增加额外的安全性,要求用户通过 Google Authenticator 等工具生成动态验证码进行二次验证。