diff --git a/docs/uniCloud/frv/dev.md b/docs/uniCloud/frv/dev.md
index 7b7ed10b89f3c40ec14f68e81ef5622aaf99d893..5667a01ab82fc3d8a1c302c9f06d3d32b74b66f1 100644
--- a/docs/uniCloud/frv/dev.md
+++ b/docs/uniCloud/frv/dev.md
@@ -37,7 +37,7 @@ sequenceDiagram
```
-- 如果您使用uni-id,那么uni-id-pages已经帮您内置好相关功能,前端页面和云端逻辑均已写好,安全、无需开发、拿来就用。[详见](待补充)
+- 如果您使用uni-id,那么uni-id-pages已经帮您内置好相关功能,前端页面和云端逻辑均已写好,安全、无需开发、拿来就用。[详见](/uniCloud/uni-id-summary.md#frv)
- 如果您的业务系统不在uniCloud上,那么需要在上述流程图中加一个原业务服务器,由云函数和原业务服务器进行token校验、传递认证结果。
### 接口防刷
@@ -368,6 +368,317 @@ module.exports = {
- HBuilderX3.7.4+新增支持,标准基座可直接真机运行,打包或自定义基座需在“App模块配置”中勾选“FacialRecognitionVerify(实人认证)”(注意不是faceId)参考[详情](https://uniapp.dcloud.net.cn/tutorial/app-facialRecognitionVerify.html)
- App-Android平台要求**Android5**(API Leavel 21)及以上系统,App-iOS平台要求**iOS9**及以上系统
- App端使用实人认证SDK,需在隐私政策的三方SDK中添加实人认证功能描述,参考[详情](https://ask.dcloud.net.cn/article/39484#FacialRecognitionVerify)
-
+### 非 uniCloud 业务使用
+
+如果您的业务没有部署在 uniCloud 上,可以通过 uni-frv-pages 来实现实人认证功能。
+uni-frv-pages 集成了实名认证前端页面和云端云对象,适用于没有使用uniCloud或没有使用uni-id账号体系的项目。
+
+插件下载地址:[https://ext.dcloud.net.cn/plugin?name=uni-frv-pages](https://ext.dcloud.net.cn/plugin?name=uni-frv-pages)
+
+
+#### 业务流程
+
+```mermaid
+sequenceDiagram
+ actor client as 客户端
+ participant cf as 开发者云函数
+ participant dev as 开发者服务器
+ participant service as 实人认证服务
+ client->>+cf: 携带token请求certifyId
+ cf->>+dev: 请求校验用户id
+ Note over cf,dev: 开发者需实现用户验证接口
供云函数调用
+ dev-->>-cf: 返回用户id
+ cf->>+service: 请求certifyId
+ service-->>-cf: 返回certifyId
+ Note over client,cf: 云函数存储uid+certifyId+实名信息的关联关系
+ cf-->>-client: 返回certifyId
+ client->>+service: 进行实人认证
+ service-->-client: 返回认证结果
+ client->>+cf: 请求绑定实名信息
+ cf->>+service: 请求认证结果
+ service-->>-cf: 返回认证结果
+ cf->>+dev: 将用户实名信息、uid发送给开发者服务器
+ dev-->>-cf: 返回绑定成功或失败
+ cf-->>-client: 返回绑定成功或失败
+```
+
+#### 项目文件说明
+```text
+├── uni_modules 存放[uni_module](/uni_modules)规范的插件。
+│ ├── uni-frv-pages
+│ │ ├── changelog.md
+│ │ ├── common 页面公共逻辑
+│ │ │ ├── check-id-card.js 校验身份证号合法性
+│ │ │ └── common.scss
+│ │ ├── components 公共组件
+│ │ │ └── uni-frv-pages-realname 实名认证组件
+│ │ │ ├── face-verify-icon.svg 实名认证错误提示Icon
+│ │ │ └── uni-frv-pages-realname.vue
+│ │ ├── package.json 包管理文件
+│ │ ├── pages
+│ │ │ └── common
+│ │ │ └── webview 用于实现应用内浏览或打开《用户协议和隐私协议》URL链接页面
+│ │ │ └── webview.vue
+│ │ ├── pages_init.json 页面初始化文件
+│ │ ├── readme.md
+│ │ └── uniCloud
+│ │ ├── cloudfunctions
+│ │ │ └── uni-frv-co 实名认证云对象
+│ │ │ ├── config.js 加载uni-config-center/uni-frv-co.json配置文件
+│ │ │ ├── functions 云对象方法目录
+│ │ │ │ ├── _after.js 云对象加载后方法
+│ │ │ │ ├── _before.js 云对象执行前方法
+│ │ │ │ ├── getAuthResult.js 获取实人认证结果
+│ │ │ │ ├── getCertifyId.js 获取实人认证认证ID
+│ │ │ │ └── index.js 导出云对象方法文件
+│ │ │ ├── index.obj.js 云对象入口
+│ │ │ ├── lang 国际化目录
+│ │ │ │ ├── en.js
+│ │ │ │ ├── index.js
+│ │ │ │ └── zh-hans.js
+│ │ │ ├── lib 云对象公共类库
+│ │ │ │ ├── constants.js 变量定义声明文件
+│ │ │ │ ├── error.js 错误码
+│ │ │ │ ├── request-webhook.js 处理业务服务器回调文件
+│ │ │ │ ├── sensitive-aes-cipher.js 敏感信息加解密
+│ │ │ │ ├── sign.js 用于给业务服务器回调数据签名
+│ │ │ │ ├── utils.js 工具类方法
+│ │ │ │ └── validator.js 请求参数校验
+│ │ │ └── package.json 包管理文件
+│ │ └── database 数据库目录
+│ │ └── opendb-frv-logs.schema.json 实人认证记录表
+```
+#### 配置(uni-frv-co)
+
+实人认证配置文件路径:`uniCloud/cloudfunctions/common/uni-config-center/uni-frv-pages/config.json`
+
+```json
+// 如果拷贝此内容切记去除注释
+{
+ "callback": { // 配置业务服务器回调
+ "userAuth": "", // 用户校验
+ "verifyResult": "" // 认证完成后结果回调
+ },
+ "requestTimeout": 5000, // 请求业务服务器超时时间
+ "realNameCertifyLimit": 5, // 限制每个用户每天实人认证次数
+ "sensitiveInfoEncryptSecret": "", // 敏感信息加密密钥(长度需要大于32位),敏感信息如:姓名、身份证号、认证照片
+ "needAlivePhoto": true, // 是否需要返回用户人脸照片
+ "requestAuthSecret": "" // 请求业务服务器时计算签名密钥
+}
+```
+
+#### 前端使用
+
+将`uni-frv-pages`插件导入至项目中,由于`uni-frv-pages`提供的实名认证入口是组件形式,需要自行准备实名认证页面,将`uni-frv-pages-realname`引入至页面中。
+
+**组件用法**
+
+```vue
+
+```
+
+**组件Props**
+
+| 属性名 | 类型 | 默认值 | 说明 |
+|-----------|--------|-----|-------------------|
+| agreement | Object | - | 隐私协议展示名称与地址,默认不展示 |
+| token | String | - | 业务系统的用户id |
+
+**组件Event**
+
+| 事件名称 | 事件说明 | 返回参数 |
+|--------|--------|-------------|
+| result | 认证成功事件 | 见下方Result说明 |
+
+Result说明
+
+| 参数 | 类型 | 说明 |
+|----------|--------|---------------------------------|
+| status | number | 认证状态:0 未认证 1 等待认证 2 认证通过 3 认证失败 |
+| idCard | string | 用户身份证号码 |
+| realName | string | 用户真实姓名 |
+
+**实名认证页面示例**
+
+```vue
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+#### 业务回调接口规范
+
+完成整个实名认证流程,需要业务服务器配合提供两个回调接口,用于用户校验与认证结果通知。
+为保证请求在网络上传输安全,在请求回调地址时,`uni-frv-co`会对请求参数进行签名,开发者在服务器需要验证签名是否正确,不正确的签名可以将请求拒绝。
+验证签名操作为开发者主动行为,需要开发者评估是否需要签名验证,不作为强制要求。但强烈建议验证签名以保证安全性。
+
+**概述**
+
+| 请求相关项 | 说明 |
+|--------|---------------------------------------------------------------|
+| 请求协议 | HTTP/HTTPS,为保证数据安全,建议使用 HTTPS |
+| 请求方式 | POST |
+| 请求类型 | application/json; charset=utf-8 |
+| 校验方式 | uni-frv-co 请求到业务服务器时,开发者应从请求头中获取签名字段进行安全校验,防止数据篡改;签名见下方请求签名说明 |
+| 请求超时时间 | 默认超时5秒钟,可在配置文件中配置 |
+
+**请求签名说明**
+
+请在`uni-frv-co`配置文件中配置`requestAuthSecret`请求鉴权密钥,确保业务服务器与配置文件中的请求鉴权密钥一致。
+
+发起请求时,将使用请求鉴权密钥计算签名,会在 HTTP 请求头中携带以下信息:
+
+| Header | 描述 |
+|-------------------|-----------------------------------------------------------------|
+| uni-frv-nonce | 随机字符串 |
+| uni-frv-timestamp | 当前时间戳; 单位毫秒 |
+| uni-frv-signature | 请求鉴权签名; 了解签名算法[详见](/uniCloud/uni-id-pages.md#http-reqeust-auth) |
+
+**用户校验**
+
+以下示例的请求地址均为示例,在实际使用中将更换为业务服务器的回调地址。
+
+HTTP 示例
+```javascript
+POST /callback/userAuth HTTP/1.1
+Host: xxx.com
+uni-frv-nonce: x9K3829
+uni-frv-timestamp: 1676882808550
+uni-frv-signature: 1C965267A4A02C6978949C7135215B0A75AEA22B2B84ED491E792365C8269EFA
+Content-Type: application/json
+Cache-Control: no-cache
+
+{"token": "test token"}
+```
+
+Request Body 说明
+
+| 名称 | 类型 | 必须 | 说明 |
+|-------|--------|-----|---------------|
+| token | string | 是 | 业务系统中的用户token |
+
+Response Body 说明
+
+| 名称 | 类型 | 必须 | 说明 |
+|---------|--------|-----|---------------------|
+| errCode | string | 是 | 错误码;成功返回0,其他错误返回错误码 |
+| errMsg | string | 否 | 错误信息;成功可以为空 |
+| uid | string | 是 | 业务系统中的用户id |
+
+**注意**
+
+- 开发者需要严格按照 ResponseBody 格式返回。
+
+**认证结果通知**
+
+
+以下示例的请求地址均为示例,在实际使用中将更换为业务服务器的回调地址。
+
+HTTP 示例
+```javascript
+POST /callback/verifyResult HTTP/1.1
+Host: xxx.com
+uni-frv-nonce: x9K3829
+uni-frv-timestamp: 1676882808550
+uni-frv-signature: 1C965267A4A02C6978949C7135215B0A75AEA22B2B84ED491E792365C8269EFA
+Content-Type: application/json
+Cache-Control: no-cache
+
+{"uid": "test uid", "realName": "张三", "idCard": '10xxxxxxxxxx', "photo": "...", "status": 2}
+```
+
+Request Body 说明
+
+| 名称 | 类型 | 必须 | 说明 |
+|----------|--------|-----|---------------------------------|
+| uid | string | 是 | 业务系统中的用户id |
+| realName | string | 是 | 真实姓名 |
+| idCard | string | 是 | 身份证号码 |
+| photo | string | 是 | 用户认证照片;needAlivePhoto为true时返回 |
+| status | string | 是 | 认证状态:0 未认证 1 等待认证 2 认证通过 3 认证失败 |
+
+Response Body 说明
+
+| 名称 | 类型 | 必须 | 说明 |
+|----------|--------|-----|---------------------|
+| errCode | string | 是 | 错误码;成功返回0,其他错误返回错误码 |
+| errMsg | string | 否 | 错误信息;成功可以为空 |
+| realName | string | 否 | 真实姓名 |
+| idCard | string | 否 | 身份证号 |
+
+**注意**
+
+- 开发者需要严格按照 `ResponseBody` 格式返回。
+- 如果有敏感数据脱敏需求,可以在响应中返回脱敏后的真实姓名和身份证号。
+
+#### 回调接口签名验证
+
+**nodejs示例**
+
+```javascript
+function verify (body, signature, timestamp, nonce) {
+ const timeout = 30 * 1000 // 请求超过30秒不能再请求,防止重放攻击
+ const bodyStr = Object.keys(body)
+ .sort()
+ .filter(item => typeof body[item] !== 'object')
+ .map(item => `${item}=${body[item]}`)
+ .join('&')
+
+ if (isNaN(Number(timestamp)) || (Number(timestamp) + timeout) < Date.now()) {
+ throw {
+ errCode: "ILLEGAL_REQUEST"
+ }
+ }
+
+ const reSignature = crypto.createHmac('sha256', `${requestAuthSecret + nonce}`).update(`${timestamp}${bodyStr}`).digest('hex')
+
+ if (signature !== reSignature.toUpperCase()) {
+ throw {
+ errCode: "ILLEGAL_REQUEST"
+ }
+ }
+
+ return true
+}
+```
+
+其他语言参考[签名算法](/uniCloud/uni-id-pages.md#http-reqeust-auth)自行实现签名验证逻辑
+
diff --git a/docs/uniCloud/uni-id-pages.md b/docs/uniCloud/uni-id-pages.md
index fc9bab207939204b5b025ad44094cd905b577db2..059312b9fa6fe32714826fe1898a39a212fac192 100644
--- a/docs/uniCloud/uni-id-pages.md
+++ b/docs/uniCloud/uni-id-pages.md
@@ -1528,6 +1528,40 @@ await uniIdCo.getInvitedUser({
- 仅在用户token即将过期时返回新newToken
+
+#### 获取账户实名信息(脱敏)@get-realname-info
+
+接口名:getRealNameInfo
+
+**接口形式**
+
+```js
+await uniIdCo.getRealNameInfo({
+ decryptData
+})
+```
+
+**参数说明**
+
+|参数名 |类型 |必填 |说明 |
+|-- |-- |-- |-- |
+|decryptData |boolean |否 |是否解密数据;默认:true|
+
+**返回值**
+
+| 参数名 | 类型 | 说明 |
+|-------------|---------------------|-----------------------------------|
+| errCode | string|number | 错误码 |
+| errMsg | string | 错误信息 |
+| type | number | 用户类型:0 个人用户 1 企业用户 |
+| authStatus | number | 认证状态:0 未认证 1 等待认证 2 认证通过 3 认证失败 |
+| realName | string | 姓名(脱敏);用户类型为 0 时返回 |
+| identity | string | 身份证号码(脱敏);用户类型为 0 时返回 |
+
+**注意**
+
+在uni-id-pages中默认启用敏感数据加解密,如果开发者没有使用uni-id提供的[敏感信息加密](uniCloud/uni-id-summary.md#sensitive-info-encrypt)功能,请将`decryptData`参数改为`false`,返回原始信息
+
### 安全验证@verifier
#### 创建图形验证码@create-captcha
@@ -2008,7 +2042,7 @@ await uniIdCo.updateUserInfoByExternal({
|-- |-- |-- |-- |
|uid |string |否 |uni-id体系的用户Id;与externalUid 二选一 |
|externalUid |string |否 |自身系统的用户id;与 uid 二选一 |
-| username | string | 否 | 用户名 |
+| username | string | 是 | 用户名 |
| password | string | 否 | 密码 |
| nickname | string | 否 | 昵称 |
| authorizedApp | Array<string> | 否 | 允许登录的app列表 |
@@ -2025,6 +2059,67 @@ await uniIdCo.updateUserInfoByExternal({
| errCode | string|number | 错误码 |
| errMsg | string | 错误信息 |
+### 实名认证
+
+#### 获取认证ID@get-frv-certify-id
+
+接口名:getFrvCertifyId
+
+**接口形式**
+
+```js
+await uniIdCo.getFrvCertifyId({
+ realName,
+ idCard,
+ metaInfo
+})
+```
+
+**参数说明**
+
+| 参数名 | 类型 | 必填 | 说明 |
+|------------|------------|-----|---------------------|
+| realName | string | 是 | 用户真实姓名 |
+| idCard | string | 是 | 用户身份证号码 |
+| metaInfo | String | 是 | 客户端初始化时返回的metaInfo |
+
+**返回值**
+
+|参数名 |类型 |说明 |
+|-- |-- |-- |
+|errCode |string|number |错误码 |
+|errMsg |string |错误信息 |
+|certifyId |object |认证Id;用于客户端调用认证接口及云函数获取认证结果 |
+
+
+#### 获取认证结果@get-frv-auth-result
+
+接口名:getFrvAuthResult
+
+**接口形式**
+
+```js
+await uniIdCo.getFrvAuthResult({
+ certifyId
+})
+```
+
+**参数说明**
+
+|参数名 |类型 |必填 |说明 |
+|-- |-- |-- |-- |
+|certifyId |string |是 |认证Id |
+
+**返回值**
+
+| 参数名 | 类型 | 说明 |
+|---------------|---------------------|----------------------------------------------------------------------------|
+| errCode | string|number | 错误码 |
+| errMsg | string | 错误信息 |
+| authStatus | number | 认证状态:0 未认证 1 等待认证 2 认证通过 3 认证失败 |
+| realName | string | 姓名(脱敏);[敏感信息加密参考](/uniCloud/uni-id-summary.md#sensitive-info-encrypt) |
+| identity | string | 身份证号码(脱敏);[敏感信息加密参考](/uniCloud/uni-id-summary.md#sensitive-info-encrypt) |
+
### 其他功能@extra-function
### 覆盖或新增校验规则@custom-validator
@@ -2241,7 +2336,7 @@ exports.main = async (event, context) => {
## URL化请求鉴权签名@http-reqeust-auth
uni-id 在URL化请求时,会对以下 API 进行调用鉴权验证,
-在调用 API 时,开发者需要使用请求鉴权密钥`requestAuthSecret`按照 uni-id 的约定方式对请求中的关键数据进行签名值计算,
+在调用 API 时,开发者需要使用请求鉴权密钥(详见[配置文件](/uniCloud/uni-id-summary.md#config))`requestAuthSecret`按照 uni-id 的约定方式对请求中的关键数据进行签名值计算,
并将签名值添加到Header请求头的 `uni-id-signature` 参数中传给 uni-id 进行签名验证,uni-id 会对接收到数据进行签名值计算,
并与接收到的请求签名值进行比对,如果签名值不一致,则视为无效签名,将拒绝本次请求。
@@ -2250,7 +2345,6 @@ uni-id 在URL化请求时,会对以下 API 进行调用鉴权验证,
|---|
|externalRegister|
|externalLogin|
-|updateUserInfoByExternal|
### 请求头公共参数
@@ -2279,7 +2373,7 @@ class Sign {
getSignature (params, nonce, timestamp) {
const paramsStr = this.getParamsString(params)
- const signature = crypto.createHmac('sha256', `${this.requestAuthSecret}${nonce}`).update(`${timestamp}${paramsStr}`).digest('hex')
+ const signature = crypto.createHmac('sha256', `${requestAuthSecret}${nonce}`).update(`${timestamp}${paramsStr}`).digest('hex')
return signature.toUpperCase()
}
diff --git a/docs/uniCloud/uni-id-summary.md b/docs/uniCloud/uni-id-summary.md
index 7ae15ac87b1f1d11f2a2c12749d7ba28da069afa..fee8c9fd0c244feb0e6f729065b4f2aa5a5ab090 100644
--- a/docs/uniCloud/uni-id-summary.md
+++ b/docs/uniCloud/uni-id-summary.md
@@ -208,6 +208,10 @@ uni-id的云端配置文件在`uniCloud/cloudfunctions/common/uni-config-center/
"passwordErrorRetryTime": 3600, // 密码错误重试次数超限之后的冻结时间
"autoSetInviteCode": false, // 是否在用户注册时自动设置邀请码,默认不自动设置
"forceInviteCode": false, // 是否强制用户注册时必填邀请码,默认为false
+ "idCardCertifyLimit": 1, // 实名认证相关; 限制每个身份证可以绑定几个账号
+ "realNameCertifyLimit": 5, // 实名认证相关; 限制用户每日认证次数,防止接口被刷
+ "sensitiveInfoEncryptSecret": "", // 敏感信息加密密钥(长度需要大于32位),如使用实名认证功能需配置此密钥
+ "frvNeedAlivePhoto": false, // 实名认证相关;是否获取认证照片
"app": { // 如果你使用旧版本uni-id公共模块而不是uni-id-common这里可能配置的是app-plus,务必注意调整为app
"tokenExpiresIn": 2592000,
"tokenExpiresThreshold": 864000,
@@ -334,10 +338,10 @@ uni-id-co 与 uni-id-pages 内的前端页面均支持这四个内置规则
|支付宝小程序端登录 |配置`mp-alipay.oauth.alipay`,在支付宝开放平台获取:[支付宝开放平台](https://openhome.alipay.com/develop/manage) |
|Apple APP端登录 |配置`app.oauth.apple`,在Apple开发者中心自行配置:[Apple开发者中心](https://developer.apple.com/account/resources/identifiers/list)|
-## token令牌@token
-
-::: warning 注意
-如需保持活跃客户端的登录状态,请勿将token有效期设置一个很大的值,具体如何实现请参考:[保持客户端登录状态](#keep-client-login-state)
+## token令牌@token
+
+::: warning 注意
+如需保持活跃客户端的登录状态,请勿将token有效期设置一个很大的值,具体如何实现请参考:[保持客户端登录状态](#keep-client-login-state)
:::
首先解释下token的概念。token是服务器颁发给客户端的一个令牌。
@@ -943,7 +947,7 @@ module.exports = {
|uni-id-token-expired |登陆状态失效,token已过期 |- |
|uni-id-check-token-failed |token校验未通过 |- |
|uni-id-account-exists |账户已存在 |- |
-|uni-id-account-not-exists |账户不存在 |- |
+|uni-id-account-not-exists |账户不存在 |- |
|uni-id-account-not-exists-in-current-app| 匹配到的用户不可在当前应用登录 |
|uni-id-account-conflict |用户账号冲突 |可能会由开发者手动更新数据库导致,正常情况下不应出现 |
|uni-id-account-banned |此账号已封禁 |- |
@@ -1046,14 +1050,14 @@ exports.main = async function(event, context){
}]
```
-## 其他功能
-
-### token更新及保持客户端登录状态@keep-client-login-state
-
-一般来说token的有效期不会无限长,示例配置内web端token有效期为2小时,微信小程序为3天,app端为30天。你可以回忆一下你所用的软件,只要每天都打开就一直不需要重新登录,这样就牵扯到保持客户端的登录状态的问题。
-
-uni-id使用了判断token剩余有效时间小于一定的阈值(配置文件内的tokenExpiresThreshold)但是大于0时自动下发新token的逻辑来保证活跃客户端一直处于登录状态,返回新token的逻辑由checkToken方法实现。具体该将token有效期和token刷新阈值设置为多少,需要根据多数用户软件使用频率来确定。
-
+## 其他功能
+
+### token更新及保持客户端登录状态@keep-client-login-state
+
+一般来说token的有效期不会无限长,示例配置内web端token有效期为2小时,微信小程序为3天,app端为30天。你可以回忆一下你所用的软件,只要每天都打开就一直不需要重新登录,这样就牵扯到保持客户端的登录状态的问题。
+
+uni-id使用了判断token剩余有效时间小于一定的阈值(配置文件内的tokenExpiresThreshold)但是大于0时自动下发新token的逻辑来保证活跃客户端一直处于登录状态,返回新token的逻辑由checkToken方法实现。具体该将token有效期和token刷新阈值设置为多少,需要根据多数用户软件使用频率来确定。
+
举个例子,开发者配置的token有效期(tokenExpiresIn)为1天,token刷新阈值(tokenExpiresThreshold)为8小时。用户在0点0分0秒获取了token,如果用户在16点后(token有效期已小于8小时)调用接口时执行了checkToken方法则会返回新token。
### 裂变@fission
@@ -1557,3 +1561,69 @@ module.exports = {
在 [uniCloud 控制台](https://unicloud.dcloud.net.cn/),找到 uni-id 所在的服务空间,在云数据库中选中 `uni-id-users` 表,点击导入按钮,上传用户数据json文件即可。
[从文件中导入数据说明](https://uniapp.dcloud.net.cn/uniCloud/hellodb.html#import)
+
+### 实名认证@frv
+
+基于[实人认证](/uniCloud/frv/intro.md)服务实现,可以实现用户刷脸核验真实身份,完成实名认证。
+
+使用此功能前需要先开通实人认证服务,服务开通流程,[详见](/uniCloud/frv/service.md)
+
+uni-id-pages 中内置了实名认证页面`uni-id-pages/pages/userinfo/realname-verify/realname-verify`。
+
+
+
+如没有实名认证需求,可以将实名认证相关页面注释:
+
+1. 在`uni-id-pages/pages/userinfo/userinfo`页面中,注释掉实名认证的`uni-list-item`标签。
+2. 在`pages.json`中注释掉实名认证页面`uni_modules/uni-id-pages/pages/userinfo/realname-verify/realname-verify`。
+
+#### 配置项说明
+
+实名认证相关配置项如下,配置文件路径`uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json`,详细的uni-id配置文件[参考](#config)
+
+| 字段 | 类型 | 默认值 | 说明 |
+|----------------------------|---------|-------|-----------------------------------------------------------|
+| idCardCertifyLimit | number | 1 | 限制每个身份证可以绑定几个账号 |
+| realNameCertifyLimit | number | 5 | 限制用户每日认证次数,防止接口被刷 |
+| sensitiveInfoEncryptSecret | string | | 敏感信息加密密钥(长度需要大于32位); 见下方[敏感信息加密](#sensitive-info-encrypt) |
+| frvNeedAlivePhoto | boolean | false | 是否获取认证照片 |
+
+**注意**
+
+- 如果设置了`frvNeedAlivePhoto`参数,用户认证照片会加密后存储至云存储,[敏感信息加密参考](#sensitive-info-encrypt)
+
+#### 接口参考
+
+- 获取认证服务的 certifyId [uniIdCo.getFrvCertifyId](uniCloud/uni-id-pages.md#get-frv-certify-id)
+- 使用 certifyId 获取认证结果 [uniIdCo.getFrvAuthResult](uniCloud/uni-id-pages.md#get-frv-auth-result)
+- 获取用户实名信息(脱敏)[uniIdCo.getRealNameInfo](uniCloud/uni-id-pages.md#get-realname-info)
+
+#### 敏感信息加密@sensitive-info-encrypt
+
+用户的姓名、身份证号、实人认证照片属于用户隐私信息,为了防止隐私信息泄露,在数据存储上使用了对称加密`aes-256-cbc`算法对数据进行加密。
+在前端页面需要使用时,例如”[获取用户实名信息](uniCloud/uni-id-pages.md#get-realname-info)“接口,只会返回脱敏后的数据,减少暴露风险,提高安全性。
+
+由于加密密钥`sensitiveInfoEncryptSecret`来源于`config.json`配置文件,强烈建议更换为自定义的字符串,不要使用默认的密钥。
+密钥长度最少需要32位,密钥越长破解难度越高,但不宜过长,推荐设置为32-128位之间。
+
+实人认证照片将会上传至云存储中,阿里云与腾讯云存储路径如下:
+
+- 阿里云 `/{uid}.b64`
+- 腾讯云 `/user/id-card/{uid}.b64`
+
+注意:文件不是图片不可直接下载打开。
+
+
+
+
+