提交 34ba01c0 编写于 作者: d-u-a's avatar d-u-a

重写了安全网络

上级 18fd37bf
......@@ -2,7 +2,7 @@
简介
为了避免 `uniCloud` 客户端与服务器通信时数据被截取和篡改,
为了避免 `uni-app``uniCloud` 通信时数据被截取和篡改
**平台差异说明**
......@@ -12,7 +12,7 @@
|后续支持|3.5.5+|
语法
## callFunction
```js
uniCloud.callFunction({
......@@ -20,63 +20,65 @@ uniCloud.callFunction({
data: {
name: 'user'
},
secret: true
// ...
secret: 'both'
})
```
`secret: true` 表示使用加密网络通道,默认为 `false`
## 云对象
## App平台
后续支持
```js
uniCloud.importObject('object-name', {
customUI: false,
secret: 'both',
secretMethods: ['login']
})
```
## 微信小程序
`secret` 属性说明
### 简介
|值 |描述 |
|:-: |:-: |
|none |不加密,默认值 |
|request |客户端请求时加密数据,服务器下发数据时不加密 |
|response |客户端请求时不加密数据,服务器下发数据时加密 |
|both |客户端和服务器同时加密数据 |
微信侧维护了一个用户维度的可靠key,用于小程序和后台通信时进行加密和签名。
`secretMethods` 需要加密的方法名
开发者可以分别通过小程序前端和微信后台提供的接口,获取用户的加密 key。
### 微信的流程如下
## 依赖uniCloud模块
客户端
- `uni-id-co` [详情]()
- `uni-open-bridge` [详情]()
1. 在开发者客户端使用 `UserCryptoManager.getLatestUserKey` 获取用户最新的加密密钥信息。
2. 通过 `AES` 和加密密钥加密数据,然后发送到服务器
服务器
## App平台
在开发者服务端,请求微信服务器后台接口 `getUserEncryptKey` 获取用户最近三次的key。在获取 key 的同时,接口会携带 version 信息,开发者可以比较 version 版本来选择使用对应的 key 对数据进行加解密。
后续支持
获取 `getUserEncryptKey` 时需要参数 `openid``access_token``session_key`
1. `access_token` 需要服务器定时刷新并全局缓存
## 微信小程序
2. `session_key`
在微信客户端通过调用 `wx.login()` 获取 `code` 传递到服务器,在服务器请求微信的服务器换取 `session_key`,且在客户端任意地方调用 `wx.login()``session_key` 将失效,
在微信的多个业务中都需要用到 `session_key`,需要开发者来维护这些值
在微信小程序上依赖 `access_token``session_key`, `encrypt_key`
这些复杂的流程可以通过 `uni-open-bridge``uni-open-bridge-common` 解决,也无需人工维护,[详情](/uniCloud/uni-open-bridge)
### uniCloud流程如下
### 流程如下
1. 使用 `uni-open-bridge``uni-open-bridge-common` 接管三方开放平台数据,[详情](/uniCloud/uni-open-bridge)
2. 在应用的生命周期 `onLaunch` 中检查微信登陆状态,如果过期需要登陆
注意 `wx.checkSession` 有调用次数限制警告,一个 `pv` 可调用 `2`
注意 `uni.checkSession` 有调用次数限制警告,一个 `pv` 可调用 `2`
```js
// App.vue
<script>
function checkUserSession() {
wx.checkSession({
uni.checkSession({
fail: (err) => {
wx.login({
uni.login({
success: async ({ code }) => {
const uniIdCo = uniCloud.importObject('uni-id-co') // uniCloud云对象 uni-id-co
await uniIdCo.loginByWeixin({ code })
......@@ -97,28 +99,17 @@ uniCloud.callFunction({
</script>
```
3. 调用 `uniCloud.callFunction()`, 且传递参数 `secret: true`
```js
uniCloud.callFunction({
name: 'collection',
data: {
name: 'user'
},
secret: true,
success: (res) => {
console.log(res.result);
},
fail: (err) => {
console.log(err);
}
})
```
3. 调用 `uniCloud.callFunction()``uniCloud.importObject`
客户端 `uniCloud.callFunction({ secret: true })` 内部逻辑如下:
客户端内部逻辑如下:
1. 调用 `uniCloud.getCurrentUserInfo()` 检查本地用户登陆状态,登陆无效则调用 `wx.login()`,继续使用 `uni-id-co` 调用 `loginByWeixin({ code })`,此过程将同步更新 `uni-open-bridge-common` 保存的数据 `session_key`
2. 调用 `wx.getUserCryptoManager()` 获取加密密钥并通过 `AES` 加密数据,然后发送 `uniCloud` 服务器
1. 调用 `uniCloud.getCurrentUserInfo()` 检查本地 `uni-id` 用户登陆状态,登陆无效则调用 `uni.login()`,继续使用 `uni-id-co` 调用 `loginByWeixin({ code })`,此过程将同步更新 `uni-open-bridge-common` 保存的数据 `session_key`
2. 调用 `uni.getUserCryptoManager()` 获取加密密钥并通过 `AES` 加密数据,然后发送到 `uniCloud` 服务器
3. 等待服务器响应加密数据到达客户端后解密,回调给开发者
注意:传递参数 `secret: true``callFunction` 拦截器不会生效,因为需要在内部解密服务器端下发的加密数据
## 小贴士
安全总是相对的
安全网络是为了防止在设备上安装了受信任证书后 `https` 请求被抓包问题
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册