@builder6/oidc 3.2.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +256 -3
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -1,11 +1,264 @@
|
|
|
1
1
|
# Builder6 OIDC Client Module
|
|
2
2
|
|
|
3
|
+
Builder6 OIDC 客户端模块为 Builder6 平台提供 OpenID Connect (OIDC) 身份认证集成功能,支持通过外部身份提供者(IdP)进行单点登录(SSO)和用户认证。
|
|
3
4
|
|
|
4
|
-
##
|
|
5
|
+
## 功能特性
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
- **OpenID Connect 认证**: 支持标准的 OIDC 认证流程
|
|
8
|
+
- **单点登录 (SSO)**: 与企业身份提供者集成实现 SSO
|
|
9
|
+
- **多种认证流程**: 支持授权码流程(Authorization Code Flow)
|
|
10
|
+
- **用户信息同步**: 自动同步 OIDC 提供者的用户信息
|
|
11
|
+
- **会话管理**: 管理用户会话和令牌刷新
|
|
12
|
+
- **移动端支持**: 检测移动设备并提供优化的登录体验
|
|
13
|
+
- **安全令牌处理**: 安全地处理访问令牌和刷新令牌
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install @builder6/oidc
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
或
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
yarn add @builder6/oidc
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 环境变量
|
|
28
|
+
|
|
29
|
+
### OIDC 基本配置
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# 启用 OIDC 认证
|
|
7
33
|
B6_OIDC_ENABLED=true
|
|
34
|
+
|
|
35
|
+
# OIDC 提供者的 Issuer URL
|
|
8
36
|
B6_OIDC_ISSUER=https://id.steedos.cn/realms/master
|
|
37
|
+
|
|
38
|
+
# OIDC 客户端 ID
|
|
9
39
|
B6_OIDC_CLIENT_ID=steedos-oidc-public
|
|
10
|
-
|
|
40
|
+
|
|
41
|
+
# OIDC 客户端密钥(如果是机密客户端)
|
|
42
|
+
B6_OIDC_CLIENT_SECRET=your-client-secret
|
|
43
|
+
|
|
44
|
+
# 重定向 URI(回调地址)
|
|
45
|
+
B6_OIDC_REDIRECT_URI=http://localhost:5100/api/v6/oidc/callback
|
|
46
|
+
|
|
47
|
+
# 登出后重定向 URI
|
|
48
|
+
B6_OIDC_POST_LOGOUT_REDIRECT_URI=http://localhost:5100
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 高级配置
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# OIDC 作用域(空格分隔)
|
|
55
|
+
B6_OIDC_SCOPE=openid profile email
|
|
56
|
+
|
|
57
|
+
# 响应类型
|
|
58
|
+
B6_OIDC_RESPONSE_TYPE=code
|
|
59
|
+
|
|
60
|
+
# 启用 PKCE(公共客户端推荐)
|
|
61
|
+
B6_OIDC_PKCE_ENABLED=true
|
|
62
|
+
|
|
63
|
+
# ID 令牌签名算法
|
|
64
|
+
B6_OIDC_ID_TOKEN_SIGNED_RESPONSE_ALG=RS256
|
|
65
|
+
|
|
66
|
+
# 用户信息端点认证方法
|
|
67
|
+
B6_OIDC_USERINFO_SIGNED_RESPONSE_ALG=RS256
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 使用示例
|
|
71
|
+
|
|
72
|
+
### 在 NestJS 应用中集成
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { Module } from '@nestjs/common';
|
|
76
|
+
import { OidcModule } from '@builder6/oidc';
|
|
77
|
+
|
|
78
|
+
@Module({
|
|
79
|
+
imports: [OidcModule],
|
|
80
|
+
})
|
|
81
|
+
export class AppModule {}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### OIDC 认证流程
|
|
85
|
+
|
|
86
|
+
1. **发起登录**: 用户访问登录页面
|
|
87
|
+
2. **重定向到 IdP**: 应用重定向到 OIDC 提供者
|
|
88
|
+
3. **用户认证**: 用户在 IdP 上完成认证
|
|
89
|
+
4. **回调处理**: IdP 重定向回应用的回调地址
|
|
90
|
+
5. **令牌交换**: 应用使用授权码交换访问令牌
|
|
91
|
+
6. **用户信息获取**: 获取用户信息并创建会话
|
|
92
|
+
|
|
93
|
+
### 登录按钮示例
|
|
94
|
+
|
|
95
|
+
```html
|
|
96
|
+
<!-- 前端登录按钮 -->
|
|
97
|
+
<a href="/api/v6/oidc/auth">使用 OIDC 登录</a>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 在控制器中使用 OIDC 服务
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
import { OidcService } from '@builder6/oidc';
|
|
104
|
+
|
|
105
|
+
constructor(private oidcService: OidcService) {}
|
|
106
|
+
|
|
107
|
+
// 发起 OIDC 认证
|
|
108
|
+
@Get('auth')
|
|
109
|
+
async initiateAuth(@Res() res: Response) {
|
|
110
|
+
const authUrl = await this.oidcService.getAuthorizationUrl();
|
|
111
|
+
res.redirect(authUrl);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// 处理回调
|
|
115
|
+
@Get('callback')
|
|
116
|
+
async handleCallback(@Query('code') code: string, @Req() req: Request) {
|
|
117
|
+
const tokens = await this.oidcService.getTokens(code);
|
|
118
|
+
const userInfo = await this.oidcService.getUserInfo(tokens.access_token);
|
|
119
|
+
|
|
120
|
+
// 创建用户会话
|
|
121
|
+
req.session.user = userInfo;
|
|
122
|
+
|
|
123
|
+
return { success: true, user: userInfo };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// 登出
|
|
127
|
+
@Get('logout')
|
|
128
|
+
async logout(@Req() req: Request, @Res() res: Response) {
|
|
129
|
+
const logoutUrl = await this.oidcService.getLogoutUrl(
|
|
130
|
+
req.session.id_token
|
|
131
|
+
);
|
|
132
|
+
req.session.destroy();
|
|
133
|
+
res.redirect(logoutUrl);
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## API 端点
|
|
138
|
+
|
|
139
|
+
模块提供以下主要 API 端点:
|
|
140
|
+
|
|
141
|
+
- **GET `/api/v6/oidc/auth`**: 发起 OIDC 认证流程
|
|
142
|
+
- **GET `/api/v6/oidc/callback`**: OIDC 回调处理端点
|
|
143
|
+
- **GET `/api/v6/oidc/logout`**: OIDC 登出端点
|
|
144
|
+
- **GET `/api/v6/oidc/userinfo`**: 获取当前用户信息
|
|
145
|
+
|
|
146
|
+
## 支持的 OIDC 提供者
|
|
147
|
+
|
|
148
|
+
该模块兼容任何符合 OpenID Connect 规范的身份提供者,包括但不限于:
|
|
149
|
+
|
|
150
|
+
- **Keycloak**: 开源身份和访问管理解决方案
|
|
151
|
+
- **Auth0**: 商业身份平台
|
|
152
|
+
- **Okta**: 企业级身份管理
|
|
153
|
+
- **Azure AD**: Microsoft Azure Active Directory
|
|
154
|
+
- **Google Identity**: Google 身份服务
|
|
155
|
+
- **自定义 OIDC 服务器**: 任何符合 OIDC 标准的服务
|
|
156
|
+
|
|
157
|
+
## 配置示例
|
|
158
|
+
|
|
159
|
+
### Keycloak 配置
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
B6_OIDC_ENABLED=true
|
|
163
|
+
B6_OIDC_ISSUER=https://keycloak.example.com/realms/myrealm
|
|
164
|
+
B6_OIDC_CLIENT_ID=builder6-client
|
|
165
|
+
B6_OIDC_CLIENT_SECRET=your-secret
|
|
166
|
+
B6_OIDC_REDIRECT_URI=http://localhost:5100/api/v6/oidc/callback
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Auth0 配置
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
B6_OIDC_ENABLED=true
|
|
173
|
+
B6_OIDC_ISSUER=https://your-tenant.auth0.com
|
|
174
|
+
B6_OIDC_CLIENT_ID=your-client-id
|
|
175
|
+
B6_OIDC_CLIENT_SECRET=your-client-secret
|
|
176
|
+
B6_OIDC_REDIRECT_URI=http://localhost:5100/api/v6/oidc/callback
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Azure AD 配置
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
B6_OIDC_ENABLED=true
|
|
183
|
+
B6_OIDC_ISSUER=https://login.microsoftonline.com/your-tenant-id/v2.0
|
|
184
|
+
B6_OIDC_CLIENT_ID=your-application-id
|
|
185
|
+
B6_OIDC_CLIENT_SECRET=your-client-secret
|
|
186
|
+
B6_OIDC_REDIRECT_URI=http://localhost:5100/api/v6/oidc/callback
|
|
11
187
|
```
|
|
188
|
+
|
|
189
|
+
## 移动端支持
|
|
190
|
+
|
|
191
|
+
模块使用 `ismobilejs` 检测移动设备,并可以为移动端提供定制的登录体验:
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
import { isMobile } from '@builder6/oidc';
|
|
195
|
+
|
|
196
|
+
if (isMobile(req)) {
|
|
197
|
+
// 提供移动端优化的登录流程
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## 安全特性
|
|
202
|
+
|
|
203
|
+
- **PKCE 支持**: 增强公共客户端的安全性
|
|
204
|
+
- **State 参数**: 防止 CSRF 攻击
|
|
205
|
+
- **Nonce 验证**: 防止重放攻击
|
|
206
|
+
- **令牌验证**: 自动验证 ID 令牌签名
|
|
207
|
+
- **安全存储**: 令牌安全存储在服务器端会话中
|
|
208
|
+
|
|
209
|
+
## 依赖项
|
|
210
|
+
|
|
211
|
+
### 主要依赖
|
|
212
|
+
|
|
213
|
+
- `openid-client`: ^5.7.1 - OpenID Connect 客户端库
|
|
214
|
+
- `ejs`: ^3.1.10 - 模板引擎
|
|
215
|
+
- `ismobilejs`: ^1.1.1 - 移动设备检测
|
|
216
|
+
- `lodash`: ^4.17.21 - 工具函数库
|
|
217
|
+
- `request-ip`: ^3.3.0 - IP 地址获取
|
|
218
|
+
|
|
219
|
+
### Peer Dependencies
|
|
220
|
+
|
|
221
|
+
- `@builder6/core`: ^3.0.10 - 核心功能模块
|
|
222
|
+
- `@nestjs/common`: ^11.0.0 - NestJS 核心
|
|
223
|
+
- `@nestjs/core`: ^11.0.0 - NestJS 核心
|
|
224
|
+
- `@nestjs/swagger`: ^11.0.7 - API 文档
|
|
225
|
+
|
|
226
|
+
## 开发
|
|
227
|
+
|
|
228
|
+
### 构建
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
npm run build
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### 监听模式
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
npm run build:watch
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 格式化代码
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
npm run format
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## 使用场景
|
|
247
|
+
|
|
248
|
+
- **企业 SSO**: 与企业身份提供者集成实现单点登录
|
|
249
|
+
- **社交登录**: 通过 Google、Microsoft 等社交账号登录
|
|
250
|
+
- **多租户应用**: 支持多个 OIDC 租户配置
|
|
251
|
+
- **零信任架构**: 基于 OIDC 的现代身份认证架构
|
|
252
|
+
|
|
253
|
+
## 故障排查
|
|
254
|
+
|
|
255
|
+
### 常见问题
|
|
256
|
+
|
|
257
|
+
1. **重定向 URI 不匹配**: 确保 `B6_OIDC_REDIRECT_URI` 与 IdP 中配置的回调 URL 完全一致
|
|
258
|
+
2. **CORS 错误**: 确保 IdP 允许应用的域名
|
|
259
|
+
3. **令牌验证失败**: 检查 IdP 的签名算法配置
|
|
260
|
+
4. **用户信息获取失败**: 确保请求的作用域包含必要的用户信息
|
|
261
|
+
|
|
262
|
+
## License
|
|
263
|
+
|
|
264
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@builder6/oidc",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"request-ip": "^3.3.0"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@builder6/core": "^
|
|
22
|
+
"@builder6/core": "^4.0.0",
|
|
23
23
|
"@nestjs/common": "^11.0.0",
|
|
24
24
|
"@nestjs/core": "^11.0.0",
|
|
25
25
|
"@nestjs/swagger": "^11.0.7"
|
|
@@ -27,5 +27,5 @@
|
|
|
27
27
|
"publishConfig": {
|
|
28
28
|
"access": "public"
|
|
29
29
|
},
|
|
30
|
-
"gitHead": "
|
|
30
|
+
"gitHead": "6d6e13fed8d4b3c6de14f84dcb6287c5661ea6f6"
|
|
31
31
|
}
|