Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_43977266
unidocs-zh
提交
dd36e0d3
U
unidocs-zh
项目概览
weixin_43977266
/
unidocs-zh
与 Fork 源项目一致
Fork自
red_password / unidocs-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
dd36e0d3
编写于
8月 09, 2022
作者:
d-u-a
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add secret-net
上级
65986bcb
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
122 addition
and
0 deletion
+122
-0
docs/uniCloud/secret-net.md
docs/uniCloud/secret-net.md
+122
-0
未找到文件。
docs/uniCloud/secret-net.md
0 → 100644
浏览文件 @
dd36e0d3
# uniCloud 加密网络通道
简介
为了避免
`uniCloud`
客户端与服务器通信时数据被截取和篡改,
**平台差异说明**
|App|微信小程序|
|:-:|:-:|
|后续支持|3.5.5+|
语法
```
js
uniCloud
.
callFunction
({
name
:
'
collection
'
,
data
:
{
name
:
'
user
'
},
secret
:
true
// ...
})
```
`secret: true`
表示使用加密网络通道,默认为
`false`
## App平台
后续支持
## 微信小程序
### 简介
微信侧维护了一个用户维度的可靠key,用于小程序和后台通信时进行加密和签名。
开发者可以分别通过小程序前端和微信后台提供的接口,获取用户的加密 key。
### 微信的流程如下
客户端
1.
在开发者客户端使用
`UserCryptoManager.getLatestUserKey`
获取用户最新的加密密钥信息。
2.
通过
`AES`
和加密密钥加密数据,然后发送到服务器
服务器
在开发者服务端,请求微信服务器后台接口
`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`
,需要开发者来维护这些值
这些复杂的流程可以通过
`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`
次
```
js
// App.vue
<
script
>
function
checkUserSession
()
{
wx
.
checkSession
({
fail
:
(
err
)
=>
{
wx
.
login
({
success
:
async
({
code
})
=>
{
const
uniIdCo
=
uniCloud
.
importObject
(
'
uni-id-co
'
)
// uniCloud云对象 uni-id-co
await
uniIdCo
.
loginByWeixin
({
code
})
}
})
}
})
}
export
default
{
onLaunch
:
function
()
{
console
.
log
(
'
App Launch
'
)
checkUserSession
();
}
}
<
/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
);
}
})
```
客户端
`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`
服务器
3.
等待服务器响应加密数据到达客户端后解密,回调给开发者
注意:传递参数
`secret: true`
的
`callFunction`
拦截器不会生效,因为需要在内部解密服务器端下发的加密数据
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录