mirror of
https://github.com/huiyiruciduojiao/KeycloakQRLogin.git
synced 2026-01-28 03:24:37 +08:00
3a41e0e7f5f933b3f99c3115d0b73c6e51e4ca19
- 创建项目概述和主要特性说明 - 添加技术架构和数据流图描述- 提供详细的配置项说明和默认值 - 编写安装部署步骤和环境要求 - 添加API接口说明和主要端点 - 补充开发指南和项目结构说明- 增加安全说明和特殊注意事项 - 添加许可证和联系信息
Keycloak QR Login
易识IT 开发的基于二维码的 Keycloak 登录插件。
项目概述
本项目是一个 Keycloak 身份提供商(Identity Provider)插件,实现了基于二维码的登录功能。用户可以通过扫描二维码,在移动设备上确认登录,实现更便捷、安全的身份验证。
主要特性:
- 支持二维码生成和展示
- 支持扫码状态轮询
- 支持基于JWT Token的身份验证
- 支持内存和Redis两种会话存储方式
- 完整的签名验证机制保证通信安全
- 可配置的各项参数
技术架构
主要组件
- QRLoginIdentityProvider: 核心身份提供商实现
- QRLoginEndpoint: REST API端点,处理扫码、确认等操作
- SessionStore: 会话存储接口及实现(内存/Redis)
- SignatureUtil: 签名工具,保障通信安全
- 前端脚本: 实现二维码展示和状态轮询
数据流
1. 用户访问登录页面 -> 2. 点击"二维码登录" -> 3. 生成二维码并展示
↓
4. 用户使用App扫描二维码 <- 5. App调用/qr/scan接口
↓
6. 用户在App确认登录 -> 7. App调用/qr/confirm接口
↓
8. 前端轮询/qr/status获取状态 -> 9. 跳转到确认后的回调URL完成登录
配置说明
插件配置项
| 配置项 | 说明 | 默认值 |
|---|---|---|
| Session TTL (s) | 二维码会话有效期(秒) | 120 |
| Poll Interval (ms) | 前端轮询间隔(毫秒) | 1500 |
| Store Type | 存储类型(redis或memory) | memory |
| Redis URI | Redis连接地址 | redis://127.0.0.1:6379 |
| Redis Namespace | Redis键前缀 | qrlogin: |
| HMAC Secret | 签名校验密钥 | change-me |
| Algorithm | 签名算法 | HmacSHA256 |
| Time Window Seconds | 请求有效时间范围(秒) | 5 |
环境要求
- Keycloak 20+
- Java 17+
- Redis (可选,用于分布式部署)
安装部署
-
构建项目:
mvn clean package -
将生成的JAR包复制到Keycloak的providers目录:
cp target/keycloak-qr-login-*.jar $KEYCLOAK_HOME/providers/ -
重启Keycloak服务
-
在Keycloak管理界面中配置QR Login身份提供商
API 接口
详细API文档请参考 OpenAPI 文档
主要接口:
- POST
/qr/scan: 处理二维码扫描 - POST
/qr/confirm: 处理登录确认 - GET
/qr/status: 查询二维码状态
开发指南
项目结构
src/main/java/top/ysit/qrlogin
├── config # 配置类
├── core # 核心组件
│ ├── security # 安全相关
│ ├── store # 会话存储
│ └── util # 工具类
├── idp # 身份提供商实现
│ ├── resource # REST资源
│ │ ├── endpoint # 端点实现
│ │ └── factory # 工厂类
│ └── QRLoginIdentityProvider*
└── spi # SPI实现
扩展功能
- 添加新的存储实现:
core\SessionStore.java接口 - 自定义签名算法: 扩展
SignatureConfig.SignatureAlgorithm - 修改前端样式: 编辑主题文件
theme/qrlogin/login/resources/js/script.js
安全说明
- 所有API调用均需签名验证
- 时间戳验证防止重放攻击
- JWT Token验证确保用户身份合法性
- 会话具有固定有效期,防止长期有效攻击
特殊说明
- Redis功能暂时没有开发完整,待完善。
- 基于IDP ISP 实现的,所以用户第一次登录时,需要绑定账号
- 前端登录效果需要依赖
theme/qrlogin/login/resources/js/script.js文件
许可证
Apache License 2.0
联系我们
易识IT
Description
Languages
Java
90.2%
JavaScript
9.8%