secure-network.md 21.0 KB
Newer Older
W
wanganxp 已提交
1
## uni云端一体安全网络
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
2

W
wanganxp 已提交
3
> HBuilderX 3.6.8+ 支持
d-u-a's avatar
d-u-a 已提交
4

W
wanganxp 已提交
5
## 简介
d-u-a's avatar
d-u-a 已提交
6

W
wanganxp 已提交
7
网络安全的问题很多:
d-u-a's avatar
d-u-a 已提交
8

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
9 10
1. 客户端受信。由于http的无状态,客户端的真实性很难保证。模拟客户端、重签apk,防不胜防。
2. 网络受信。即便是https的请求也会被抓包,路由器、地方运营商都可能获取你的数据、劫持和改写你的请求。
d-u-a's avatar
d-u-a 已提交
11

W
wanganxp 已提交
12
当攻击者了解了你的服务器接收什么样的数据时,就可以冒名客户端,提交假数据来攻击你的服务器。
d-u-a's avatar
d-u-a 已提交
13

雪洛's avatar
雪洛 已提交
14
尤其当你的业务中涉及促销、返佣、激励视频等场景,非常容易被刷。薅羊毛已经是一个非常成熟的灰产,哪里有漏洞,哪里就有他们赚钱的机会。
d-u-a's avatar
d-u-a 已提交
15

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
16
DCloud面向开发者同时提供了端引擎`uni-app` 和 云引擎`uniCloud`,如今进一步升级,提供云端一体的安全网络的能力。
d-u-a's avatar
d-u-a 已提交
17

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
18
`uni-app` 连接 `uniCloud` 时,可以选择是否启动安全网络。它通过高安全的保护机制,解决了客户端受信和网络受信的问题,防止客户端伪造和通信内容抓包。
d-u-a's avatar
d-u-a 已提交
19

W
wanganxp 已提交
20 21 22 23 24 25
uni云端一体安全网络,提供了如下2个实用功能:

|功能名称		|功能描述															|是否需要编码							|具体文档				|
|--				|--																	|--										|--						|
|客户端校验		|指定合法的客户端,包括包名、证书、appid。不授信的客户端将无法请求服务器	|只需配置,无需编码						|[文档](#verify-client)	|
|网络传输数据加密	|对网络传输的数据进行端到端加密,防止中间节点截获和篡改					|需要在联网请求的代码里设定是否加密的参数	|[文档](#encrypt-data)	|
雪洛's avatar
雪洛 已提交
26

d-u-a's avatar
d-u-a 已提交
27

W
wanganxp 已提交
28
**平台差异说明**
d-u-a's avatar
d-u-a 已提交
29

W
wanganxp 已提交
30 31 32 33 34
|App	|微信小程序	|Web|其他小程序	|
|:-:	|:-:		|:-:|:-:		|
|3.6.8+	|3.6.8+		|x	|x			|

注意:安全网络只支持微信小程序和App。并且App的安全级别更高。安全网络仅在uni-app客户端连unicloud云函数/云对象生效,云函数url化场景下不生效。
d-u-a's avatar
d-u-a 已提交
35

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
36
## 如何开通
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
37

W
wanganxp 已提交
38 39 40
不管使用安全网络的哪个功能,首先要开通安全网络。App和微信小程序略有区别,但大体都要经过如下流程:
1. 前端应用配置:在[https://dev.dcloud.net.cn/](https://dev.dcloud.net.cn/)的应用管理中指定要开通的应用,在“各平台信息”中配置app的包名、签名摘要或者微信小程序的appid。
2. 云端配置:在[uniCloud控制台](https://unicloud.dcloud.net.cn/)选定一个服务空间,在“安全网络”页面,关联在dev配好的某个应用。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
41

W
wanganxp 已提交
42
App和微信两个平台细化说明如下:
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
43

雪洛's avatar
雪洛 已提交
44
### App平台开通安全网络@prepare-app
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
45 46 47

1.[开发者中心](https://dev.dcloud.net.cn/)`应用详情 --> 证书管理`内填写安卓应用的包名、签名和iOS应用的bundleId。一个应用只能有一个发行证书配置,但是可以有多个开发证书配置

雪洛's avatar
雪洛 已提交
48
  ![证书管理](https://f184e7c3-1912-41b2-b81f-435d1b37c7b4.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/b4e76aed-6659-47e6-a18e-e41bdf804643.jpg)
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
49

雪洛's avatar
雪洛 已提交
50
2.[uniCloud控制台](https://unicloud.dcloud.net.cn/)关联允许发送安全网络请求的应用
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
51

雪洛's avatar
雪洛 已提交
52
  ![关联应用到服务空间安全网络](https://f184e7c3-1912-41b2-b81f-435d1b37c7b4.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/61e912c0-8287-441b-917d-7dd184bae729.jpg)
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
53
  
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
54 55
  本质上安全网络绑定的是应用的appid、包名、证书等信息。只不过这些信息统一配置在dev中,在uniCloud的web控制台来选择。所以务必注意dev配置的正式版、测试版的包名、签名是否正确。

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
56 57
3. 在项目根目录manifest.json文件内为app平台开启安全网络模块

雪洛's avatar
雪洛 已提交
58
  ![App云端一体安全网络模块](https://f184e7c3-1912-41b2-b81f-435d1b37c7b4.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/fe4620a4-2e16-4306-b9ae-38f1ded13a43.jpg)
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
59

雪洛's avatar
雪洛 已提交
60
  **注意:**打包后生效。测试时需打包[自定义基座](../tutorial/run/run-app.md#customplayground)
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
61

W
wanganxp 已提交
62 63 64 65 66 67
4. 在服务空间创建数据表[opendb-app-client-key](https://gitee.com/dcloud/opendb/tree/master/collection/opendb-app-client-key)用于保存发放给客户端的密钥对。

  - 如果在[uniCloud控制台](https://unicloud.dcloud.net.cn/),新建表界面在opendb表的其他分类中
  - 如果在HBuilderX的database目录点右键新建,可直接搜索`opendb-app-client-key`。新建后记得上传到uniCloud服务空间。
  
  参考文档:[创建一个表](https://uniapp.dcloud.net.cn/uniCloud/hellodb.html#create-collection)
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
68 69

  - 切勿删除或修改此集合内容,否则会导致部分客户端不能发送安全网络请求(重新安装客户端或清除客户端数据后才能正常使用)
W
wanganxp 已提交
70 71
  - 如果服务空间开通了redis,会自动在redis内存储一份客户端密钥对,以加速安全网络请求的处理。所使用的键为`unicloud:secure:app-client-key:{appId}:{deviceId}:string`
  - **强烈强烈建议开启redis功能、且在云函数package.json中关联redis扩展,**会大幅加快访问速度并减少数据库请求次数。因安全网络的加密行为已经导致比普通网络多耗时,所以商用项目请务必开通redis以保障速度。在[uniCloud控制台](https://unicloud.dcloud.net.cn/)点redis即可开通。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
72 73 74

5. 上传任意schema文件到服务空间以触发一次clientDB云端模块的更新

W
wanganxp 已提交
75
**遗留**
雪洛's avatar
雪洛 已提交
76 77

- 安全网络暂未支持离线打包,后续会提供离线打包的方案
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
78 79

### 微信小程序开通安全网络@mp-weixin
d-u-a's avatar
d-u-a 已提交
80

W
wanganxp 已提交
81
安全网络在微信小程序上的实现,依赖了微信提供的一些用户级的凭据。所以需要下载 [uni-id-pages](https://ext.dcloud.net.cn/plugin?id=8577)[uni-open-bridge](uni-open-bridge.md),并在app.vue里初始化。
d-u-a's avatar
d-u-a 已提交
82

雪洛's avatar
雪洛 已提交
83 84
**无论是处理加密请求还是需要进行验证客户端的云函数在处理微信小程序发起的请求时都必须依赖`uni-id-common`和`uni-open-bridge-common`**

雪洛's avatar
雪洛 已提交
85 86
1.[开发者中心](https://dev.dcloud.net.cn/)`应用详情 --> 【名称待定】`内填写微信小程序的appId。一个应用只能有一个发行配置,但是可以有多个开发配置

雪洛's avatar
雪洛 已提交
87
  ![微信小程序AppId绑定](https://f184e7c3-1912-41b2-b81f-435d1b37c7b4.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/8a1c5106-23ba-46a6-ab3b-3f2ca7c6883a.jpg)
雪洛's avatar
雪洛 已提交
88 89 90
  
2. 在uniCloud控制台关联允许发送安全网络请求的应用

雪洛's avatar
雪洛 已提交
91
  ![关联应用到服务空间安全网络](https://f184e7c3-1912-41b2-b81f-435d1b37c7b4.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/61e912c0-8287-441b-917d-7dd184bae729.jpg)
雪洛's avatar
雪洛 已提交
92 93

3. 工程中导入uni-id-pages
d-u-a's avatar
d-u-a 已提交
94

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
95
- `uni-id` [文档](uni-id-summary.md#save-user-token)
雪洛's avatar
雪洛 已提交
96
- `uni-id-pages` [插件下载地址](https://ext.dcloud.net.cn/plugin?id=8577),需要`uni-id-pages 1.0.27`及以上版本
d-u-a's avatar
d-u-a 已提交
97

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
98
`uni-id-pages`这个插件是云端一体的登录插件,其实安全网络只需要其中的`uni-id-co`云对象。插件中前端登录页面是否使用由开发者自己根据业务决定。
d-u-a's avatar
d-u-a 已提交
99

雪洛's avatar
雪洛 已提交
100
4. 工程中导入uni-open-bridge插件
d-u-a's avatar
d-u-a 已提交
101

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
102
安全网络在微信小程序上依赖了微信的 `access_token``session_key``encrypt_key`等凭据。这些凭据需要`uni-open-bridge`统一接管。
d-u-a's avatar
d-u-a 已提交
103

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
104 105
- `uni-open-bridge` [文档](https://uniapp.dcloud.net.cn/uniCloud/uni-open-bridge.html)
- `uni-open-bridge` [插件下载地址](https://ext.dcloud.net.cn/plugin?id=9002)
d-u-a's avatar
d-u-a 已提交
106

雪洛's avatar
雪洛 已提交
107
5. 配置uni-id和uni-open-bridge
d-u-a's avatar
d-u-a 已提交
108

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
登陆微信公众平台[https://mp.weixin.qq.com/](https://mp.weixin.qq.com/),获取微信小程序的固定凭据 `appid``secret`,配置到 uni-id-config

```json
// uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json
{
  "dcloudAppid": "__UNI__xxxxxx", // 在项目的 manifest.json 
  "mp-weixin": {
    "tokenExpiresIn": 259200,
    "oauth": {
      "weixin": {
        "appid": "", // 微信公众平台申请的小程序 appid
        "appsecret": "" // 微信公众平台申请的小程序 secret
      }
    }
  }
}
```

W
wanganxp 已提交
127
配置 `uni-open-bridge` 定时任务,定时从微信服务器获取 [access_token](uni-open-bridge.md#access_token) 并保存到Redis或数据库
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

```json
// uniCloud/cloudfunctions/common/uni-config-center/uni-open-bridge/config.json
{
  "schedule": {
    "__UNI__xxxxxx": { // dcloudAppid, 需要和 `uni-config-center` uni-id中的配置一致
      "enable": true, // 任务全局开关,优先级最高
      "weixin-mp": { // 平台,目前仅支持 微信小程序、微信 H5,详情参见 https://uniapp.dcloud.net.cn/uniCloud/uni-open-bridge#platform
        "enable": true, // 当前平台任务开关
        "tasks": ["accessToken"] // 要执行的任务,微信小程序支持 accessToken
      }
    }
  },
  "ipWhiteList": ["0.0.0.0"] // 用于 URL化后 http 调用的服务器IP白名单,即指定ip的服务器才可以访问URL化后的`uni-open-bridge云对象
}
```

W
wanganxp 已提交
145
**注意**:拷贝此文件内容时需要移除 `注释`。标准json不支持注释。在HBuilderX中可用多选`//`来批量移除注释。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
146

雪洛's avatar
雪洛 已提交
147
如果项目之前已经使用过uni-id-pages和uni-open-bridge,则上述步骤可省略。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
148

雪洛's avatar
雪洛 已提交
149
6. 在应用的生命周期 `onLaunch` 调用 `uniCloud.initSecureNetworkByWeixin()`,进行安全网络请求前的握手操作,关于此接口详细描述见:[uniCloud.initSecureNetworkByWeixin](client-sdk.md#init-secure-network-by-weixin)
d-u-a's avatar
d-u-a 已提交
150

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
151
App.vue页面需要补充如下代码:
d-u-a's avatar
d-u-a 已提交
152 153 154
```js
<script>
  export default {
雪洛's avatar
雪洛 已提交
155
    onLaunch: async function() {
d-u-a's avatar
d-u-a 已提交
156
      // #ifdef MP-WEIXIN
雪洛's avatar
雪洛 已提交
157
      await uniCloud.initSecureNetworkByWeixin()
d-u-a's avatar
d-u-a 已提交
158
      // #endif
d-u-a's avatar
d-u-a 已提交
159 160 161 162
    }
  }
</script>
```
雪洛's avatar
雪洛 已提交
163

W
wanganxp 已提交
164
注意:此方法内部会调用一次微信小程序的login,然后使用返回的code调用`uni-id-co``secureNetworkHandshakeByWeixin`方法(新增于uni-id-pages 1.0.27)
雪洛's avatar
雪洛 已提交
165
  
雪洛's avatar
雪洛 已提交
166
7. 在项目根目录manifest.json文件内为微信小程序平台开启`云端一体安全网络模块`
雪洛's avatar
雪洛 已提交
167
  
雪洛's avatar
雪洛 已提交
168
  ![微信小程序云端一体安全网络模块](https://f184e7c3-1912-41b2-b81f-435d1b37c7b4.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/ab96f1f7-af14-4f08-8b1c-699ecfce3381.jpg)
雪洛's avatar
雪洛 已提交
169

W
wanganxp 已提交
170
## 客户端强制验证@verify-client
雪洛's avatar
雪洛 已提交
171 172 173

> 新增于 HBuilderX 3.6.8

W
wanganxp 已提交
174 175 176
客户端验证用于确保发起请求的客户端的真实性,只有指定的客户端才能访问云函数。

客户端验证功能全流程由uniCloud进行控制,开启此功能后将直接拒绝无权访问的客户端调用云函数。
雪洛's avatar
雪洛 已提交
177

W
wanganxp 已提交
178
开发者首先在[uniCloud控制台](https://unicloud.dcloud.net.cn/)的安全网络页面选择哪些客户端应用可以与uniCloud建立安全网络,然后在页面上单独开启客户端强制校验。
雪洛's avatar
雪洛 已提交
179 180 181

![](https://f184e7c3-1912-41b2-b81f-435d1b37c7b4.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/bd8f8939-67d5-415b-85eb-f63d4d1dc2dc.jpg)

W
wanganxp 已提交
182 183 184 185 186
**切记**
1. 由于uni安全网络不支持web,一旦开启客户端强制校验后,web端将无法连接云函数。
2. 由于uni安全网络必须绑定自己的应用,所以不支持标准基座的真机运行,只能使用自定义基座。

开启客户端验证功能后,默认对**所有云函数**启用安全验证,仅在安全网络应用列表内配置的应用允许访问云函数。但有时,会有排除某个云函数的需求。比如指定的云函数校验或不校验客户端身份,这个云函数可能要url供外部访问。
雪洛's avatar
雪洛 已提交
187

W
wanganxp 已提交
188
所以uni安全网络提供了自定义客户端校验规则。
雪洛's avatar
雪洛 已提交
189

W
wanganxp 已提交
190
### 自定义客户端校验规则
雪洛's avatar
雪洛 已提交
191

W
wanganxp 已提交
192
在 uniCloud web控制台 的 安全网络页面,可打开自定义规则开关。开启自定义规则后,将不再执行全体云函数统一的客户端校验。改为,未被规则匹配到的云函数不进行客户端验证。
雪洛's avatar
雪洛 已提交
193

W
wanganxp 已提交
194
如下示例为一个简单的自定义规则配置:
雪洛's avatar
雪洛 已提交
195 196 197 198 199

```json
{
  "verify-client": [{ // 可访问云函数verify-client的应用列表
    "appId": "__UNI_xxxx",  // 客户端的DCloud AppId
W
wanganxp 已提交
200 201
    "platform": "android",  // 客户端平台,有三个可选值:android(安卓)、ios(iOS)、mp-weixin(微信小程序)。注意是小写
    "version": "production" // 客户端版本,有两个可选值:production(正式版)、development(测试版)。注意是小写
雪洛's avatar
雪洛 已提交
202 203 204 205
  }]
}
```

W
wanganxp 已提交
206 207 208 209 210 211 212
上述规则意味着,这个名为`verify-client`的云函数,只有应用的appid为`__UNI_xxxx`、platform即客户端平台为android、且为正式版,才能访问这个云函数;其他客户端无法访问这个云函数;且除了`verify-client`外,其他云函数可以被任何客户端随意访问。

如果想增加更多规则,在json中添加更多数组,每个数组是一条规则。比如想配置ios平台,就追加一个数组。

注意:自定义规则是一个标准的json,不支持编写注释,如需拷贝示例代码请务必去除注释。

云函数名为json的key,但可以写多个云函数。包括以下几种写法:
雪洛's avatar
雪洛 已提交
213 214 215

1. 单个云函数`verify-client`
2. 多个云函数`verify-client1,verify-client2`,注意逗号为英文逗号
W
wanganxp 已提交
216
3. 通配符`*`,代表所有云函数
雪洛's avatar
雪洛 已提交
217 218 219 220

当匹配一个云函数的自定义规则配置时,优先使用单个云函数名的配置,其次是多个云函数名的配置,最后是通配符的配置。如果都未匹配到则不对此云函数执行验证客户端的逻辑。

**注意**
雪洛's avatar
雪洛 已提交
221

雪洛's avatar
雪洛 已提交
222
- 如果修改客户端验证配置需要重新打包做出修改的客户端,如果是正在运行期间修改了配置需要重新运行客户端才会生效。
W
wanganxp 已提交
223
- 如需对clientDB请求进行客户端校验,使用`uni-clientDB`作为云函数名
雪洛's avatar
雪洛 已提交
224

雪洛's avatar
雪洛 已提交
225
## 数据加密传输@encrypt-data
d-u-a's avatar
d-u-a 已提交
226

W
wanganxp 已提交
227 228 229 230 231
除了校验客户端身份外,uni安全网络还提供了网络上下行传输数据的加密。

此时需要在客户端和服务器都要编写代码,倒不需要写具体的加密解密算法,而是需要在客户端指定哪些请求、哪些数据要加密,而在云端要校验客户端是否指定了正确的条件。

加密解密使用的是国际通行的高位AES算法。
d-u-a's avatar
d-u-a 已提交
232

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
233
具体写法如下:
雪洛's avatar
雪洛 已提交
234

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
235
### 客户端请求云函数
d-u-a's avatar
d-u-a 已提交
236

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
237
客户端通过callFunction调用云函数时,加入secretType参数。
W
wanganxp 已提交
238 239 240 241 242 243
```js
uniCloud.callFunction({
  name: 'collection',
  data: {
    name: 'user'
  },
W
wanganxp 已提交
244
  secretType: 'both' //both指上下行数据都加密,具体见下面的secretType章节
雪洛's avatar
雪洛 已提交
245 246 247 248 249 250 251 252 253 254 255
}).then(res => {
  const {
    errCode,
    errMsg
  } = res.result
  if(errCode) {
    uni.showModal({
      content: errMsg,
      showCancel: false
    })
  }
W
wanganxp 已提交
256 257
})
```
d-u-a's avatar
d-u-a 已提交
258

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
259 260
也就是每个callFunction请求,都可以指定是否加密,以及是对上行数据还是下行数据加密。

雪洛's avatar
雪洛 已提交
261 262 263
**注意**

- 安全网络相关接口不支持本地调试。即使在HBuilderX里面勾选连接本地云函数,客户端在请求时也会自动连接云端云函数。
雪洛's avatar
雪洛 已提交
264
- 由于云厂商会处理云函数抛出的错误,为保证客户端取到正确的错误码,云函数在返回安全网络错误时会在success回调内`res.result`内包含具体错误
雪洛's avatar
雪洛 已提交
265

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
266
### 客户端请求云对象
W
wanganxp 已提交
267

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
268
客户端通过importObject调用云对象时,通过secretMethods参数来配置每个方法调用时是否加密。
W
wanganxp 已提交
269 270

```js
雪洛's avatar
雪洛 已提交
271
const obj = uniCloud.importObject('object-name', {
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
272
  secretMethods: {'login':'both'} // 对login方法设置为上下行的数据均要加密。也支持配置所有方法设置加密,参见下面的 secretMethods 说明
W
wanganxp 已提交
273
})
雪洛's avatar
雪洛 已提交
274 275 276 277 278 279
obj.test().then(()=>{}).catch(err => {
  uni.showModal({
    content: err.errMsg || err.message,
    showCancel: false
  })
})
W
wanganxp 已提交
280 281
```

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
282 283
也就是云对象导入时配置某个方法的请求是否要加密,以及是对上行数据还是下行数据加密。那么在客户端调用云对象的相应方法时会自动按这个配置执行。

雪洛's avatar
雪洛 已提交
284
### clientDB
285

W
wanganxp 已提交
286 287 288
clientDB暂不支持网络数据加密传输。但仍可以使用客户端身份校验。

### 参数说明
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
289 290 291 292 293

**secretType 属性说明**

|值			|描述												|
|:-:		|:-:												|
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
294
|none		|上下行都不加密,默认值										|
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
295 296 297 298
|request	|只加密客户端请求时的上行数据,服务器下发数据不加密	|
|response	|客户端请求时不加密数据,只加密服务器下发的数据		|
|both		|客户端和服务器上行下行数据都加密数据				|

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
299 300
- 之所以提供如此精细的加密配置,是因为加解密都是消耗资源的,增加了等待时间。一般只对真正需要防止网络窃取的保密数据才加密。

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
301 302
**secretMethods 属性说明**

303 304 305 306 307 308
`secretMethods` 是云对象中指定需要加密的方法名。

- 对所有方法设置加密,例如 `secretMethods: {'*':'both'}`
- 对每个方法配置加密,例如 `secretMethods: {'login':'both'}`,指定 `login` 方法的 `secretType` 为 both

方法级配置优先级最高,例如 `secretMethods: {'*':'response', 'login':'both'}`,login 的 both 覆盖了 `'*':'response'`
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
309

雪洛's avatar
雪洛 已提交
310 311
**注意**

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
312
- 微信小程序安全网络依赖于登录逻辑,因此在客户端检测到发送安全网络请求时,若用户未登录则会自动调用uni-id-co的loginByWeixin接口
雪洛's avatar
雪洛 已提交
313

雪洛's avatar
雪洛 已提交
314
### 服务器端
315

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
316 317 318
uni云端一体安全网络,已经在底层封装好了复杂的安全相关的算法。开发者只需关心对哪些请求、哪些数据进行加密。

**不管是客户端接收云端数据、还是云端接受客户端数据,开发者的代码拿到的数据永远都是解密后的数据。**
319

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
320
但云端有一个注意事项:为了避免客户端伪造`secretType`获取服务器敏感数据,应以服务器端为准,如果客户端携带的 `secretType` 不符合要求应拒绝响应数据。
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
321

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
322
示例代码如下:
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
323

雪洛's avatar
雪洛 已提交
324
#### 云函数中验证secretType
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
325

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
326
在云函数的context中有secretType。如果这个云函数的返回数据必须加密,那么应该使用如下方式校验客户端的请求是否合法。
327 328 329 330 331 332 333

```js
exports.main = async (event, context) => {
  const secretType = context.secretType
  // secretType 是客户端调用 uniCloud.callFunction 传递的参数 secretType

  if (secretType !== 'both' || secretType !== 'response') {
雪洛's avatar
雪洛 已提交
334
    throw new Error('secretType invalid') // 拒绝返回有效数据
335 336 337 338
  }
}
```

雪洛's avatar
雪洛 已提交
339
#### 云对象中验证secretType
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
340

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
341
在云对象的this中有secretType。如果这个云对象的reward方法的返回数据必须加密,那么应该使用如下方式校验客户端的请求是否合法。
342 343 344 345 346 347 348

```js
module.exports = {
  async _before() {
    const methodName = this.getMethodName()
    const clientInfo = this.getClientInfo()
    const secretType = clientInfo.secretType
d-u-a's avatar
d-u-a 已提交
349
    // methodName 是客户端调用的方法名
350 351
    // secretType 是客户端调用 uniCloud.importObject 传递的参数 secretMethods

雪洛's avatar
雪洛 已提交
352
    if (methodName === 'reward' && (secretType !== 'both' || secretType !== 'response')) {
DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
353
      throw new Error('secretType invalid') // 拒绝返回有效数据
354 355 356 357 358
    }
  }
}
```

雪洛's avatar
雪洛 已提交
359 360
## 错误码@err-code

雪洛's avatar
雪洛 已提交
361
自HBuilderX 3.6.9起安全网络使用以下错误规范,此前错误码未统一不建议使用。安全网络使用的错误规范参考:[错误规范](../tutorial/err-spec.md)
雪洛's avatar
雪洛 已提交
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393

### 客户端错误

|错误码	|错误详情																																									|
|---		|---																																											|
|10001	|App平台不支持小程序sdk和标准基座																													|
|10003	|App平台appKey为空,请尝试重新打包																												|
|10009	|App平台加密失败																																					|
|10010	|App平台解密失败																																					|
|20101	|客户端信息不在允许访问的客户端信息列表内,如果云端调整配置需要重新打包/运行客户端才会生效|
|20102	|微信小程序平台获取加密key失败																														|

### 云端错误

|错误码	|错误详情																												|
|---		|---																														|
|50000	|系统错误																												|
|60101	|客户端AppId缺失																								|
|60102	|客户端DeviceId缺失																							|
|60103	|客户端OsName缺失																								|
|60200	|服务空间未开通安全网络																					|
|60201	|当前应用AppId尚未关联到uniCloud安全网络												|
|60202	|当前应用AppId已关联到uniCloud安全网络,但是当前客户端平台未关联|
|70001	|客户端时间错误																									|
|70002	|客户端AppId未通过校验																					|
|70003	|客户端DeviceId未通过校验																				|
|70004	|客户端信息未通过校验																						|
|70005	|用户账号不存在																									|
|70006	|未找到用户openid																								|
|70007	|获取加密key失败																								|
|70008	|客户端验证所需的签名缺失																				|
|70009	|未找到加密key																									|
雪洛's avatar
雪洛 已提交
394 395

微信小程序加解密时还会使用uni-id-common的checkToken方法,相关错误码参考:[uni-id错误码](uni-id-summary.md#errcode)
396

W
wanganxp 已提交
397 398
## 小贴士

DCloud_Heavensoft's avatar
DCloud_Heavensoft 已提交
399 400 401 402
1. 安全是相对的,没有绝对的安全。uni云端一体安全网络只是帮助普通开发者达到了业内一流的安全水准。
2. 安全涉及的范围很广,除了安全网络包含的范围外,还有账户密码、云端各种key和secret,都要保护好。很多安全事故是程序员误把关键key提交到github等代码托管平台。
3. 安全是有代价的,加密的数据越庞大,加密和解密的耗时越长。
4. 开启安全网络后,如果觉的联网速度变慢,一方面要开启redis,并在云函数中挂载redis扩展库;另一方面控制加密的数据量,没必要加密的数据就别加密。