Skip to content

Commit 4e169d6

Browse files
authored
feat(apigw_manager/drf): update to support multiple stages (TencentBlueKing#196)
1 parent 0446ffc commit 4e169d6

10 files changed

Lines changed: 164 additions & 128 deletions

File tree

sdks/apigw-manager/docs/jwt-explain.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# jwt 说明
22

3-
后端服务接入网关时, 接口可能开启了应用认证/用户认证, 此时调用方需要传认证header头 `X-Bkapi-Authorization`, 网关认证通过后, 会生成一个 `X-Bkapi-JWT` 头给到后端服务, 里面包含了认证结果信息, 这是一个 jwt token
3+
后端服务接入网关时接口可能开启了应用认证/用户认证,此时调用方需要传认证 header 头 `X-Bkapi-Authorization`, 网关认证通过后会生成一个 `X-Bkapi-JWT` 头给到后端服务里面包含了认证结果信息这是一个 jwt token
44

55
![img](./images/jwt.png)
66

7-
## 如何获取网关公钥
7+
## 1. 如何获取网关公钥
88

99
后端服务如需解析 API 网关发送的请求头 X-Bkapi-JWT,需要提前获取该网关的公钥。获取网关公钥,有以下方案。
1010

11-
### 1. 根据 SDK 提供的 Django Command 拉取
11+
### 1.1 根据 SDK 提供的 Django Command 拉取
1212

1313
在同步网关数据时,直接添加以下 Command 拉取网关公钥。网关公钥将保存在 model Context 对应的库表 apigw_manager_context 中,SDK 提供的 Django 中间件将从表中读取网关公钥。
1414

@@ -20,14 +20,14 @@ python manage.py fetch_apigw_public_key
2020
python manage.py fetch_apigw_public_key --gateway-name my-gateway
2121
```
2222

23-
### 2. 直接获取网关公钥,配置到项目配置文件
23+
### 1.2 直接获取网关公钥,配置到项目配置文件
2424

2525
服务仅需接入一些固定的网关部署环境时,可在网关管理端,网关基本信息中查询网关公钥,并配置到项目配置文件。
2626

2727
蓝鲸官方网关,需要自动注册并获取网关公钥,可联系蓝鲸官方运营同学,在服务部署前,由官方提前创建网关,并设置网关公钥、私钥,同时将网关公钥同步给后端服务。
2828
具体可参考 helm-charts 仓库的 README。
2929

30-
### 3. 通过网关公开接口,拉取网关公钥
30+
### 1.3 通过网关公开接口,拉取网关公钥
3131

3232
API 网关提供了公钥查询接口,后端服务可按需根据接口拉取网关公钥,接口信息如下:
3333

@@ -53,9 +53,9 @@ curl -X GET 'https://bkapi.example.com/api/bk-apigateway/prod/api/v1/apis/{gatew
5353

5454
- 拉取公钥时,不能实时拉取,需要添加缓存(实时拉取会导致整体接口性能下降)
5555

56-
## 校验请求来自 API 网关
56+
## 2. 校验请求来自 API 网关
5757

58-
### 场景一:Django 项目
58+
### 2.1 场景一:Django 项目
5959

6060
要在后端服务中认证 API 网关传递过来的请求头 `X-Bkapi-JWT`,可以通过在 settings 中的 MIDDLEWARE 中添加以下 Django 中间件。这样,在请求处理过程中,会自动解析请求头中的 X-Bkapi-JWT,并将相关信息添加到 request 对象中。
6161

@@ -86,7 +86,7 @@ AUTHENTICATION_BACKENDS += [
8686

8787
- SDK model Context (库表 apigw_manager_context),需提前执行 `python manage.py fetch_apigw_public_key` 拉取并保存网关公钥
8888

89-
- settings.APIGW_PUBLIC_KEY,可在网关基本页面/API公钥通过点击`复制`按钮或者`下载`获取公钥,并配置到 settings 中。
89+
- settings.APIGW_PUBLIC_KEY,可在网关基本页面/API 公钥通过点击`复制`按钮或者`下载`获取公钥,并配置到 settings 中。
9090

9191
> 公钥示例:
9292
> ```shell
@@ -113,7 +113,7 @@ AUTHENTICATION_BACKENDS += [
113113
114114
##### ApiGatewayJWTUserMiddleware
115115
116-
根据 `request.jwt`,在 `request` 中注入 `user` 对象:
116+
根据 `request.jwt`,在 `request` 中注入 `user` 对象
117117
118118
- 如果用户通过认证:其为一个 Django User Model 对象,用户名为当前请求用户的用户名
119119
- 如果用户未通过认证,其为一个 Django AnonymousUser 对象,用户名为当前请求用户的用户名
@@ -157,7 +157,7 @@ APIGW_MANAGER_DUMMY_PAYLOAD_APP_CODE # JWT payload 中的 app_code
157157
APIGW_MANAGER_DUMMY_PAYLOAD_USERNAME # JWT payload 中的 username
158158
```
159159

160-
### 场景二:非 Django 项目
160+
### 2.2 场景二:非 Django 项目
161161

162162
非 Django 项目,需要项目获取网关公钥,并解析请求头中的 X-Bkapi-JWT;获取网关公钥的方案请参考上文。
163163

@@ -188,4 +188,4 @@ APIGW_MANAGER_DUMMY_PAYLOAD_USERNAME # JWT payload 中的 username
188188
"nbf": 1701399303, # Not Before 时间
189189
"iss": "APIGW" # 签发者
190190
}
191-
```
191+
```

sdks/apigw-manager/docs/plugin-use-guide.md

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
# 插件配置说明
2+
23
插件配置支持主要在 `stage`(definition.yaml) 和 `resource`(resource.yaml) 两个维度上,资源配置的插件优先级最高。
3-
> 注意:所有配置均以 yaml 配置同步为主,举例来说: 如果通过yaml配置的插件配置则会覆盖掉用户在网关管理页面创建的插件配置,如果 yaml 没有配置该插件,则也不会移除
4-
> 用户之前在页面创建的插件配置,不过 yaml 如果没有配置上一次yaml配置的插件,则会移除上一次 yaml 配置的插件。
5-
> `CORS` 插件和 `IP 访问保护插件` 不推荐在yaml配置绑定在环境上。
4+
> 注意:所有配置均以 yaml 配置同步为主,举例来说:如果通过 yaml 配置的插件配置则会覆盖掉用户在网关管理页面创建的插件配置,如果 yaml 没有配置该插件,则也不会移除
5+
> 用户之前在页面创建的插件配置,不过 yaml 如果没有配置上一次 yaml 配置的插件,则会移除上一次 yaml 配置的插件。
6+
> `CORS` 插件和 `IP 访问保护插件` 不推荐在 yaml 配置绑定在环境上。
7+
8+
## 1. 跨域资源共享(CORS)插件
69

7-
## 跨域资源共享(CORS)插件
10+
### 1.1 参数说明
811

912
| 参数 | 类型 | 默认值 | 描述 |
1013
| ---------------- | ------ | ------ | ------------------------------------------------------------ |
@@ -15,7 +18,7 @@
1518
| max_age | 整数 | 86400 | 浏览器缓存 CORS 结果的最大时间,单位为秒。 |
1619
| allow_credential | 布尔值 | true | 是否允许跨域访问的请求方携带凭据(如 Cookie 等)。 |
1720

18-
### 配置例子
21+
### 1.2 配置例子
1922

2023
```yaml
2124
- type: bk-cors
@@ -28,14 +31,16 @@
2831
allow_credential: false
2932
```
3033
31-
## Header 转换插件
34+
## 2. Header 转换插件
35+
36+
### 2.1 参数说明
3237
3338
| 参数 | 类型 | 默认值 | 描述 |
3439
| ------ | ---- | ------ | ---------------------------- |
3540
| set | 数组 | [] | 设置的请求头,包括键和值。 |
3641
| remove | 数组 | [] | 删除的请求头,只需要提供键。 |
3742
38-
### 配置例子
43+
### 2.2 配置例子
3944
4045
```yaml
4146
- type: bk-header-rewrite
@@ -46,15 +51,17 @@
4651
remove: []
4752
```
4853
49-
## IP 访问保护插件
54+
## 3. IP 访问保护插件
55+
56+
### 3.1 参数说明
5057
5158
| 参数 | 类型 | 默认值 | 描述 |
5259
| --------- | ------ | ------ | -------------------------------------- |
5360
| whitelist | 字符串 | "" | 白名单中的 IP 地址,支持 CIDR 表示法。 |
5461
| blacklist | 字符串 | "" | 黑名单中的 IP 地址,支持 CIDR 表示法。 |
5562
| message | 字符串 | "" | 当 IP 地址不被允许时显示的消息。 |
5663
57-
### 配置例子
64+
### 3.2 配置例子
5865
5966
```yaml
6067
- type: bk-ip-restriction
@@ -64,16 +71,18 @@
6471
message: 'Your IP is not allowed'
6572
```
6673
67-
## 频率控制插件
74+
## 4. 频率控制插件
75+
76+
### 4.1 参数说明
6877
6978
| 参数 | 类型 | 默认值 | 描述 |
7079
| ----------- | ------ | ------ | ------------------------------------------------ |
7180
| rates | 对象 | {} | 包含默认频率限制和特殊应用频率限制的对象。 |
7281
| default | 对象 | {} | 单个应用的默认频率限制,包括次数和时间范围。 |
7382
| specials | 数组 | [] | 特殊应用频率限制,对指定应用设置单独的频率限制。 |
74-
| bk_app_code | 字符串 | "" | 蓝鲸应用ID,用于特殊应用频率限制。 |
83+
| bk_app_code | 字符串 | "" | 蓝鲸应用 ID,用于特殊应用频率限制。 |
7584
76-
### 配置例子
85+
### 4.2 配置例子
7786
7887
```yaml
7988
- type: bk-rate-limit

sdks/apigw-manager/docs/sync-apigateway-with-django.md

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
### 直接使用 Django Command 同步网关
1+
# 直接使用 Django Command 同步网关
22

33
项目安装 SDK apigw-manager 后,可以直接执行 SDK 提供的 Django Command。
4+
45
- 准备文件的样例 [examples/django/use-custom-script](../examples/django/use-custom-script)
56

6-
#### 步骤1. 准备自定义同步脚本
7+
## 步骤 1. 准备自定义同步脚本
78

89
创建一个 bash 脚本,如 `sync-apigateway.sh`,使用 SDK 提供的 Django Command 定义网关配置的同步脚本,样例如下:
10+
911
```shell
1012
#!/bin/bash
1113

@@ -31,7 +33,7 @@ python manage.py sync_apigw_config --gateway-name=${gateway_name} --file="${defi
3133
python manage.py sync_apigw_stage --gateway-name=${gateway_name} --file="${definition_file}"
3234

3335
# 同步网关资源
34-
#
36+
#
3537
# --delete: 当资源在服务端存在,却未出现在资源定义文件中时,指定本参数会强制删除这类资源,以保证服务端资源和文件内容完全一致。
3638
# 如果未指定本参数,将忽略未出现的资源
3739
# --doc_language: en/zh 是否生成接口文档(中文/英文)
@@ -54,6 +56,7 @@ echo "gateway sync definition end"
5456
```
5557

5658
如果需要更灵活的控制,也可以采用自定义 Django Command 的方案,例如:
59+
5760
```python
5861
from django.conf import settings
5962
from django.core.management.base import BaseCommand
@@ -64,7 +67,7 @@ class Command(BaseCommand):
6467
def handle(self, *args, **kwargs):
6568
if not getattr(settings, "SYNC_APIGATEWAY_ENABLED", True):
6669
return
67-
70+
6871
# 待同步网关名,需修改为实际网关名;直接指定网关名,则不需要配置 Django settings BK_APIGW_NAME
6972
gateway_name = "bk-demo"
7073

@@ -81,15 +84,15 @@ class Command(BaseCommand):
8184
call_command("fetch_apigw_public_key", f"--gateway-name={gateway_name}")
8285
```
8386

84-
#### 步骤2. 添加 SDK apigw-manager
87+
## 步骤 2. 添加 SDK apigw-manager
8588

8689
将 SDK apigw-manager 添加到项目依赖中,如 pyproject.toml 或 requirements.txt。
8790

88-
#### 步骤3. 将准备的网关配置文件,添加到项目
91+
## 步骤 3. 将准备的网关配置文件,添加到项目
8992

9093
将准备的网关配置文件:definition.yaml, resources.yaml, apidocs (可选),添加到项目
9194

92-
#### 步骤4. 更新 Django settings 配置
95+
## 步骤 4. 更新 Django settings 配置
9396

9497
在 Django settings.py 中定义网关名称和接口地址模板:
9598

@@ -104,7 +107,7 @@ BK_APIGW_NAME = "my-gateway-name"
104107
# 需将 bkapi.example.com 替换为真实的云 API 域名;
105108
# 在 PaaS 3.0 部署的应用,可从环境变量中获取 BK_API_URL_TMPL,不需要额外配置;
106109
# 实际上,SDK 将调用网关 bk-apigateway 接口将数据同步到 API 网关
107-
BK_API_URL_TMPL = "http://bkapi.example.com/api/{api_name}/" ## 例如:网关host是:`bkapi.example.com`,则对应的值为:http://bkapi.example.com/api/{api_name} 注意:{api_name} 这个是占位符。
110+
BK_API_URL_TMPL = "http://bkapi.example.com/api/{api_name}/" ## 例如:网关 host 是:`bkapi.example.com`,则对应的值为:http://bkapi.example.com/api/{api_name} 注意:{api_name} 这个是占位符。
108111
```
109112

110113
在 INSTALLED_APPS 中加入以下配置,SDK 将创建表 `apigw_manager_context` 用于存储一些中间数据:
@@ -115,9 +118,10 @@ INSTALLED_APPS += [
115118
]
116119
```
117120

118-
#### 步骤5. 同步网关数据到 API 网关
121+
## 步骤 5. 同步网关数据到 API 网关
119122

120123
chart 部署方案,可采用 K8S Job 同步,样例如下:
124+
121125
```yaml
122126
apiVersion: batch/v1
123127
kind: Job
@@ -140,12 +144,12 @@ spec:
140144
```
141145
142146
二进制部署方案,在部署阶段直接执行 sync-apigateway.sh 脚本:
147+
143148
```shell
144149
bash support-files/bin/sync-apigateway.sh
145150
```
146151

147-
148-
### 支持的 Django Command 列表
152+
## 支持的 Django Command 列表
149153

150154
```bash
151155
# 可选,为网关添加关联应用,关联应用可以通过网关 bk-apigateway 提供的接口管理网关数据

0 commit comments

Comments
 (0)