
1) 【一句话结论】采用分层架构结合OAuth2.0+JWT,前端统一认证入口,后端通过令牌服务管理不同认证方式,结合缓存和异步处理保障性能与安全。
2) 【原理/概念讲解】
老师:同学们,设计多认证方式的安全认证模块,核心是“统一入口+分层处理”。首先得理解几个关键概念:
3) 【对比与适用场景】
| 认证方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 密码 | 用户设置的字符序列 | 传统方式,需加密存储 | 主认证方式,日常登录 | 密码强度要求高,需加盐哈希 |
| 短信验证码 | 通过手机号发送的动态码 | 动态验证,二次验证 | 需要额外验证的场景(如修改密码) | 防刷(频率限制)、短信资源成本 |
| 人脸识别 | 生物特征识别技术 | 高安全性,无感知 | 高安全需求场景(如重要权限) | 隐私合规(GDPR等)、活体检测防欺骗 |
4) 【示例】
示例请求:
POST /api/auth/login
{
"username": "user123",
"password": "password123",
"method": "password" // 或 "sms", "face"
}
后端处理伪代码:
def login(request):
method = request.data.get('method')
if method == 'password':
# 验证密码(bcrypt加密存储)
user = User.objects.get(username=request.data['username'])
if bcrypt.checkpw(request.data['password'].encode(), user.password_hash):
token = generate_jwt(user.id, user.role)
return Response({'token': token})
elif method == 'sms':
# 发送验证码(短信服务)
send_sms(request.data['username'])
return Response({'message': '验证码已发送'})
elif method == 'face':
# 人脸识别(调用第三方服务)
result = face_recognition_service.verify(request.data['face_image'])
if result['is_liveness'] and result['is_match']:
token = generate_jwt(request.data['user_id'], request.data['role'])
return Response({'token': token})
return Response({'error': '认证失败'}, status=401)
5) 【面试口播版答案】
面试官您好,针对教务系统的用户认证模块,我设计的方案核心是采用分层架构,统一认证入口,通过OAuth2.0+JWT实现安全认证,同时支持多种方式。具体来说,前端有一个统一的登录入口,用户选择密码、短信或人脸识别后,后端通过令牌服务处理不同认证逻辑。密码认证采用bcrypt加密存储,短信验证码有防刷机制,人脸识别加入活体检测。性能上,令牌通过Redis缓存,减少数据库压力,短信验证码使用异步队列处理,避免阻塞主流程。这样既保证了安全性,又提升了性能。
6) 【追问清单】
7) 【常见坑/雷区】