diff --git a/docs/uniCloud/uni-id.md b/docs/uniCloud/uni-id.md index 5c0c48f97fc07e445984da3ec945eba288087e50..4a069d90a4699810e574d54b940d243686020a70 100644 --- a/docs/uniCloud/uni-id.md +++ b/docs/uniCloud/uni-id.md @@ -1,100 +1,100 @@ -# 需求背景 - -99%的应用,都要开发用户注册、登录、发送短信验证码、密码加密保存、修改密码、token管理等功能,从前端到后端都需要。 - -为什么不能有一个开源的通用项目,避免大家的重复开发呢? - -`uni-id`应需而生。 - -`uni-id`为`uniCloud`开发者提供了简单、统一、可扩展的用户管理能力封装。 - -# 组成部分 -`uni-id`包括如下组成部分: -1. 云数据库 - -主表为 `uni-id-users` 表,保存用户的基本信息。 - -扩展字段有很多,如实名认证数据、工作履历数据,开发者可以自由扩展。 - -2. 云函数 - -提供一个名为`uni-id`的公共模块,该模块封装了一系列API,包括注册、登录、修改密码、设置头像等。 - -示例工程中还提供了一个`user-center`的云函数,演示在云函数中如何调用`uni-id`公共模块。 - -3. 前端调用 - -前端示例通过callfunction调用云函数`user-center`,在注册和登录时保存token。 - -uniCloud框架底层,会自动在callfunction时传递`uni-id`的token(uni-app 2.7.13+版本)。在云函数的event中可直接拿到`uni-id`的token。也就是说开发者无需自己管理token了。 - -# uni-id 对开发者的价值 -1. 节省了大量重复劳动 -2. 降低门槛,前端开发者无需纠结怎样设计数据库设计才更合理 -3. 多系统打通用户和上下游协同 - -关于第三点,着重强调下。 - -一个应用,往往需要集成多个功能模块。比如一个电商应用,需要一个基本电商模板,还需要客服聊天模板,甚至还需要用户交流社区。 - -在插件市场,每类模板插件都能找到,但他们如果不是基于同一套用户体系设计,就很难整合。 - -DCloud推荐所有uniCloud的应用,都基于`uni-id`来做。 - -有了统一的账户规范,并且围绕这套账户规范,有各种各样插件,那么开发者可以随意整合这些插件,让数据连同。 - -规范,还可以让上下游充分协同。插件市场会出现各种数据迁移插件,比如把从discuz里把用户迁移到`uni-id`中的插件,相信围绕这套规范的产业链会非常活跃。 - -# 现状和未来 - -`uni-id`已完整的内容: - -- 注册、登录、发送短信验证码、密码加密保存、修改密码、token管理(短信验证码功能需要HBuilderX 2.8.3+) -- 三方登录:App中的微信登录、微信小程序中的微信登录、支付宝小程序中的支付宝账户登录 - -关于还缺少的部分,哪些DCloud在完善,哪些希望开发者给共同完善开源项目,计划与边界公布如下: - -1. 部分社交账户登录 - -DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple ID、微博、QQ等App端的登录。欢迎其他开发者在开源项目上提交pr,共同完善`uni-id`。 - -2. 邮箱验证和手机号一键认证sdk集成 - -手机号一键认证sdk,目前插件市场里已经有不少相关插件,未来DCloud会整合到`uni-id`中。邮箱验证,DCloud暂无计划开发,有需求的开发者欢迎提供pr。 - -3. 实名认证、活体检测 - -目前插件市场里已经有不少相关插件,未来DCloud会整合到`uni-id`中。 - -4. 权限管理ACL - -这部分欢迎开发者参与完善。 - -其他方面,各种常见开源项目如discuz、wordPress、ecshop的用户导入插件,不属于`uni-id`主工程,欢迎开发者单独提交插件到插件市场。 - -`uni-id`的git仓库:[https://gitee.com/dcloud/uni-id.git](https://gitee.com/dcloud/uni-id.git) - - -# 快速上手 - -使用uni-id需要按照以下步骤操作 - -1. 准备2.7.14或以上版本的HBuilderX -2. 插件市场导入`uni-id`公用模块,[插件市场 uni-id](https://ext.dcloud.net.cn/plugin?id=2116) -3. 修改公用模块`uni-id`下的`config.json`内所需参数(请参考下面config.json的说明) -4. 上传`cloudfunctions/common`下的`uni-id`模块 -5. 按照[公用模块使用说明](https://uniapp.dcloud.io/uniCloud/cf-common)在云函数下安装`uni-id`模块 -6. 创建`uni-id-users`、`uni-verify`集合(可以直接使用示例项目里面的db_init.json进行初始化) - -或者直接导入[uni-id在插件市场的示例工程](https://ext.dcloud.net.cn/plugin?id=2116) - +# 需求背景 + +99%的应用,都要开发用户注册、登录、发送短信验证码、密码加密保存、修改密码、token管理等功能,从前端到后端都需要。 + +为什么不能有一个开源的通用项目,避免大家的重复开发呢? + +`uni-id`应需而生。 + +`uni-id`为`uniCloud`开发者提供了简单、统一、可扩展的用户管理能力封装。 + +# 组成部分 +`uni-id`包括如下组成部分: +1. 云数据库 + +主表为 `uni-id-users` 表,保存用户的基本信息。 + +扩展字段有很多,如实名认证数据、工作履历数据,开发者可以自由扩展。 + +2. 云函数 + +提供一个名为`uni-id`的公共模块,该模块封装了一系列API,包括注册、登录、修改密码、设置头像等。 + +示例工程中还提供了一个`user-center`的云函数,演示在云函数中如何调用`uni-id`公共模块。 + +3. 前端调用 + +前端示例通过callfunction调用云函数`user-center`,在注册和登录时保存token。 + +uniCloud框架底层,会自动在callfunction时传递`uni-id`的token(uni-app 2.7.13+版本)。在云函数的event中可直接拿到`uni-id`的token。也就是说开发者无需自己管理token了。 + +# uni-id 对开发者的价值 +1. 节省了大量重复劳动 +2. 降低门槛,前端开发者无需纠结怎样设计数据库设计才更合理 +3. 多系统打通用户和上下游协同 + +关于第三点,着重强调下。 + +一个应用,往往需要集成多个功能模块。比如一个电商应用,需要一个基本电商模板,还需要客服聊天模板,甚至还需要用户交流社区。 + +在插件市场,每类模板插件都能找到,但他们如果不是基于同一套用户体系设计,就很难整合。 + +DCloud推荐所有uniCloud的应用,都基于`uni-id`来做。 + +有了统一的账户规范,并且围绕这套账户规范,有各种各样插件,那么开发者可以随意整合这些插件,让数据连同。 + +规范,还可以让上下游充分协同。插件市场会出现各种数据迁移插件,比如把从discuz里把用户迁移到`uni-id`中的插件,相信围绕这套规范的产业链会非常活跃。 + +# 现状和未来 + +`uni-id`已完整的内容: + +- 注册、登录、发送短信验证码、密码加密保存、修改密码、token管理(短信验证码功能需要HBuilderX 2.8.3+) +- 三方登录:App中的微信登录、微信小程序中的微信登录、支付宝小程序中的支付宝账户登录 + +关于还缺少的部分,哪些DCloud在完善,哪些希望开发者给共同完善开源项目,计划与边界公布如下: + +1. 部分社交账户登录 + +DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple ID、微博、QQ等App端的登录。欢迎其他开发者在开源项目上提交pr,共同完善`uni-id`。 + +2. 邮箱验证和手机号一键认证sdk集成 + +手机号一键认证sdk,目前插件市场里已经有不少相关插件,未来DCloud会整合到`uni-id`中。邮箱验证,DCloud暂无计划开发,有需求的开发者欢迎提供pr。 + +3. 实名认证、活体检测 + +目前插件市场里已经有不少相关插件,未来DCloud会整合到`uni-id`中。 + +4. 权限管理ACL + +这部分欢迎开发者参与完善。 + +其他方面,各种常见开源项目如discuz、wordPress、ecshop的用户导入插件,不属于`uni-id`主工程,欢迎开发者单独提交插件到插件市场。 + +`uni-id`的git仓库:[https://gitee.com/dcloud/uni-id.git](https://gitee.com/dcloud/uni-id.git) + + +# 快速上手 + +使用uni-id需要按照以下步骤操作 + +1. 准备2.7.14或以上版本的HBuilderX +2. 插件市场导入`uni-id`公用模块,[插件市场 uni-id](https://ext.dcloud.net.cn/plugin?id=2116) +3. 修改公用模块`uni-id`下的`config.json`内所需参数(请参考下面config.json的说明) +4. 上传`cloudfunctions/common`下的`uni-id`模块 +5. 按照[公用模块使用说明](https://uniapp.dcloud.io/uniCloud/cf-common)在云函数下安装`uni-id`模块 +6. 创建`uni-id-users`、`uni-verify`集合(可以直接使用示例项目里面的db_init.json进行初始化) + +或者直接导入[uni-id在插件市场的示例工程](https://ext.dcloud.net.cn/plugin?id=2116) + 导入示例项目时,如果选择腾讯云,在HBuilderX2.7及以下版本中,需要进入项目目录,手动将目录`cloudfunctions-aliyun`改名为`cloudfunctions-tcb`,然后在HBuilderX中右键cloudfunctions绑定服务空间。 **config.json的说明** -注意: - -- **config.json是一个标准json文件,不支持注释** +注意: + +- **config.json是一个标准json文件,不支持注释** - 如果不希望使用config.json初始化而是想自行传入参数,可以使用`init`方法[uniID.init](/uniCloud/uni-id?id=init) 配置项: @@ -107,24 +107,24 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple + 如果使用`sendSmsCode`接口发送短信需要前往[https://dev.dcloud.net.cn/uniSms](https://dev.dcloud.net.cn/uniSms)充值短信额度,配置`config.json`的`service`字段,字段说明见下方示例 + 如果使用其他方式发送短信可以参考`sendSmsCode`接口的实现[uni-id sendSmsCode](https://gitee.com/dcloud/uni-id/blob/master/src/lib/send-sms-code.js) + 另外可以按照客户端平台进行不同的配置,参考下面示例 - -**下面的配置文件中所有时间的单位都是秒** + +**下面的配置文件中所有时间的单位都是秒** ```json // 如果拷贝此内容切记去除注释 { "passwordSecret": "passwordSecret-demo", // 加密密码所用的密钥,注意修改为自己的,使用一个较长的字符串即可 "tokenSecret": "tokenSecret-demo", // 生成token所用的密钥,注意修改为自己的,使用一个较长的字符串即可 - "tokenExpiresIn": 7200, // 全平台token过期时间,未指定过期时间的平台会使用此值 - "tokenExpiresThreshold": 600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值则自动获取新token,请注意将新token返回给前端保存,如果不配置此参数则不开启自动获取新token功能 + "tokenExpiresIn": 7200, // 全平台token过期时间,未指定过期时间的平台会使用此值 + "tokenExpiresThreshold": 600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值则自动获取新token,请注意将新token返回给前端保存,如果不配置此参数则不开启自动获取新token功能 "bindTokenToDevice": true, // 是否将token和设备绑定,设置为true会进行ua校验,默认为true "passwordErrorLimit": 6, // 密码错误最大重试次数 - "passwordErrorRetryTime": 3600, // 密码错误重试次数超限之后的冻结时间 - "autoSetInviteCode": false, // 是否在用户注册时自动设置邀请码,默认不自动设置 + "passwordErrorRetryTime": 3600, // 密码错误重试次数超限之后的冻结时间 + "autoSetInviteCode": false, // 是否在用户注册时自动设置邀请码,默认不自动设置 "forceInviteCode": false, // 是否强制用户注册时必填邀请码,默认为false(需要注意的是目前只有短信验证码注册才可以填写邀请码),设置为true时需要在loginBySms时指定type为register来使用注册,登录时也要传入type为login "app-plus": { "tokenExpiresIn": 2592000, - "oauth": { + "oauth": { // App微信登录所用到的appid、appsecret需要在微信开放平台获取,注意:不是公众平台而是开放平台 "weixin": { "appid": "weixin appid", @@ -133,7 +133,7 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple } }, "mp-weixin": { - "oauth": { + "oauth": { // 微信小程序登录所用的appid、appsecret需要在对应的小程序管理控制台获取 "weixin": { "appid": "weixin appid", @@ -142,11 +142,11 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple } }, "mp-alipay": { - "oauth": { + "oauth": { // 支付宝小程序登录用到的appid、privateKey请参考支付宝小程序的文档进行设置或者获取,https://opendocs.alipay.com/open/291/105971#LDsXr "alipay": { "appid": "alipay appid", - "privateKey": "alipay privateKey", // 私钥 + "privateKey": "alipay privateKey", // 私钥 "keyType": "PKCS8" // 私钥类型,如果私钥类型不是PKCS8,需要填写此字段,否则会出现“error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag”错误 } } @@ -161,62 +161,203 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及Apple } } ``` - -# 特色功能 - -## 角色权限@rbac - -自`1.1.9`版本起uni-id支持角色权限(通常情况下管理后台会需要角色权限)。除[角色权限API](uniCloud/uni-id.md?id=rbac-api)内列出的角色权限相关的接口外,还有以下调整: - -1. 所有登录注册接口可以接收`needPermission`参数,配置为true时会在`checkToken`接口返回用户权限(permission),否则permission字段会是一个空数组。开发者可以在用户登录管理后台时,传入此参数表示当前登录的用户需要返回permission。 - -2. 新增两个数据表`uni-id-roles`、`uni-id-permissions`,可以使用示例项目里面的db_init.json创建,也可以直接使用opendb中的这两个数据表 - -以管理后台为例,开发者可以在用户登录时传入`needPermission: true`。在checkToken时返回的结果中会包含role和permission,可以据此判断用户有没有权限进行操作。 - -```js -// 简单的权限校验示例 -function hasPermission(token, permission) { - const checkTokenRes = await uniID.checkToken(token) - if(checkTokenRes.code) { - return false - } - return checkTokenRes.permission.includes(permission) -} -``` - -**注意** - -- uni-id内`admin`角色为超级管理员(即role内包含admin即可拥有所有权限)。uni-clientDB内也做了这种实现,如果用户角色包含`admin`就拥有所有数据表的全部权限。 - -## 裂变@fission - -自`1.1.2`版本起uni-id支持裂变功能,目前仅适用手机号+验证码方式注册可以填写邀请码(inviteCode)接受邀请。裂变相关API请参考[裂变API](uniCloud/uni-id.md?id=fission-api) - -在`config.json`内配置了`autoSetInviteCode: true`则在用户注册时会自动给设置不重复的6位邀请码,如果不希望使用自动设置的邀请码可以自行传入`myInviteCode`参数来设置邀请码,需要注意的是要保证邀请码唯一。 - -在`config.json`内配置了`forceInviteCode: true`则只有使用邀请码才可以注册(仅手机号+验证码注册方式支持)。 - -针对之前使用了旧版本(不支持裂变)的uni-id,现在想增加裂变功能,可以调用`setUserInviteCode`接口给已注册用户设置邀请码,在设置之前可以使用`my_invite_code不存在`作为条件查询所有需要设置的用户。 - -如果希望用户注册完成之后再填写邀请人的邀请码,可以调用`acceptInvite`接口来使用户接受邀请。 - -`getInvitedUser`接口可以用于获取接受邀请的用户列表,其中level参数可以用来设置要获取哪一级的邀请用户,不填写level参数则默认获取第一级。 - -如果想详细的体验一下裂变流程,可以在插件市场导入[前后一体登录模板](https://ext.dcloud.net.cn/plugin?id=13),此项目内已有邀请用户注册示例,流程如下 - -**分享邀请码/邀请链接** - - - - -**受邀者注册** - - + +# 特色功能 + +## 角色权限@rbac + +为什么需要权限管理? +- 对于后台管理系统,除了超级管理员,不同账号通常需根据职位、责任设定不同的系统权限。 +- [clientDB](https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。 + +`uni-id`如何解决权限管理问题? +- 基于经典的RBAC模型实现内置角色权限系统。 + +### RBAC模型简介 + +RBAC:Role-Based Access Control,基于角色的访问控制。 + +其基本思想:对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有权限。 + +![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/431878b0-0ca0-11eb-8a36-ebb87efcf8c0.png) + +这样做的好处是,增强系统管理的扩展性,对于批量用户的权限变更,仅需变更该批用户角色对应权限即可,而无需对该批每个用户变更权限。 + +这个模型有三个关键名词:用户、角色、权限: +- 用户:使用系统的人,一个用户可以同时有多个角色 +- 角色:权限的集合,一个角色可以有多个权限 +- 权限:数据权限或业务权限,例如:删除用户、删除评论等 + +### 用户 + +用户信息存储在`uni-id-users`表中,然后通过`role`字段保存该用户所拥有的所有角色ID,角色ID即角色表(`uni-id-roles`表)中的`role_id`字段,注意不是`_id`字段。 + +``` +{ + { + "_id":"5f8428181c229600010389f6", + "username":"uniapp", + "email":"hr2013@dcloud.io", + role:[ + "USER_ADMIN", + "NOTICE_ADMIN" + ], + "created_date":1602495783272 + } +} +``` + +>Tips:将用户角色设计为用户表的字段,而没有新建`用户角色关联表`的原因:避免mongodb在跨表查询时的性能开销 + +### 角色 + +角色信息存储在`uni-id-roles`表中 + +| 字段 | 类型 | 必填| 描述 | +| ---------- | --------- | ----| --------------------------------------| +| \_id | Object ID | 是 | 系统自动生成的Id | +| role_id | String | 是 | 角色唯一标识 | +| role_name | String | 否 | 角色名,展示用 | +| permission | Array | 是 | 角色拥有的权限列表 | +| comment | String | 否 | 备注 | +| created_date| Timestamp | 是 | 角色创建时间 | + +其中: +- `role_id`为角色标志,全局唯一,可用于clientDB中的权限控制,建议按照语义化命名,例如:`USER_ADMIN`表示人事管理、`NOTICE_ADMIN`表示公告管理 +- `permission`为数组类型,存储该角色拥有的所有权限ID,权限ID即权限表(`uni-id-permissions`表)中的`permission_id`字段,注意不是`_id`字段 + +如下为示例: + +``` +{ + { + "_id":"5f8428181c229600010389f6", + "role_id":"USER_ADMIN", + "role_name":"人事管理", + permission:[ + "USER_ADD", + "USER_EDIT", + "USER_DEL" + ], + "created_date":1602495783272 + }, + { + "_id":"5f842836d8daea0001906785", + "role_id":"NOTICE_ADMIN", + "role_name":"公告管理", + permission:[ + "NOTICE_ADD", + "NOTICE_EDIT", + "NOTICE_DEL" + ], + "created_date":1602495784372 + } +} +``` + +如下是角色在clientDB中的配置示例: + +``` +// db-permission/uni-id-users.js + +{ + ".update":"doc._id == auth.uid || 'USER_ADMIN' in auth.role" //用户自己或人事管理员可执行用户表的.update操作 +} +``` + +>Tips1:uni-id中`admin`为超级管理员角色,uni-clientDB也基于同样的策略;如果用户角色包含`admin`,则该用户就拥有所有数据表的全部权限。 + +>Tips2:出厂时可内置常用角色,也可上线后由运营人员动态创建角色。 + +### 权限 + +权限信息在`uni-id-permissions`表中,表结构定义如下: + +| 字段 | 类型 | 必填| 描述 | +| ---------- | --------- | ----| --------------------------------------| +| \_id | Object ID | 是 | 系统自动生成的Id | +| permission_id | String | 是 | 权限唯一标识 | +| permission_name | String | 否 | 权限名,展示用 | +| comment | String | 否 | 备注 | +| created_date | Timestamp | 是 | 权限创建时间 | + +其中,`permission_id`为权限标志,全局唯一,可用于clientDB中的权限配置,建议按照语义化命名,例如:`USER_DEL`、`BRANCH_ADD`。 + +如下为示例内容: + +``` +{ + { + "_id":"5f8428181c229600010389f6", + "permission_id":"USER_EDIT", + "permission_name":"修改用户", + "created_date":1602495783272 + }, + { + "_id":"5f842836d8daea0001906785", + "permission_id":"USER_DEL", + "permission_name":"删除用户", + "created_date":1602495784372 + } +} +``` + +如下是权限在clientDB中的配置示例: + +``` +// db-permission/uni-id-users.js + +{ + ".update":"doc._id == auth.uid || 'USER_EDIT' in auth.permission" //用户自己或有`USER_EDIT`权限的用户,可执行用户表的.update操作 +} +``` + +>Tips1:建议出厂时内置所有权限,方便clientDB中的权限配置。 + +### 其他说明 + +uni-id针对角色权限模块封装了丰富的API,比如:获取用户角色、获取某角色下的所有权限等,详情参考:[角色权限API](uniCloud/uni-id.md?id=rbac-api)。 + +uni-id登录注册接口可接收`needPermission`参数,若`needPermission`配置为true时,后续会在`checkToken`接口返回用户权限列表(permission)。如下是通过token判断权限的简单示例: + +```js +// 简单的权限校验示例 +function hasPermission(token, permission) { + const checkTokenRes = await uniID.checkToken(token) + return checkTokenRes.permission.includes(permission) +} +``` + + + +## 裂变@fission + +自`1.1.2`版本起uni-id支持裂变功能,目前仅适用手机号+验证码方式注册可以填写邀请码(inviteCode)接受邀请。裂变相关API请参考[裂变API](uniCloud/uni-id.md?id=fission-api) + +在`config.json`内配置了`autoSetInviteCode: true`则在用户注册时会自动给设置不重复的6位邀请码,如果不希望使用自动设置的邀请码可以自行传入`myInviteCode`参数来设置邀请码,需要注意的是要保证邀请码唯一。 + +在`config.json`内配置了`forceInviteCode: true`则只有使用邀请码才可以注册(仅手机号+验证码注册方式支持)。 + +针对之前使用了旧版本(不支持裂变)的uni-id,现在想增加裂变功能,可以调用`setUserInviteCode`接口给已注册用户设置邀请码,在设置之前可以使用`my_invite_code不存在`作为条件查询所有需要设置的用户。 + +如果希望用户注册完成之后再填写邀请人的邀请码,可以调用`acceptInvite`接口来使用户接受邀请。 + +`getInvitedUser`接口可以用于获取接受邀请的用户列表,其中level参数可以用来设置要获取哪一级的邀请用户,不填写level参数则默认获取第一级。 + +如果想详细的体验一下裂变流程,可以在插件市场导入[前后一体登录模板](https://ext.dcloud.net.cn/plugin?id=13),此项目内已有邀请用户注册示例,流程如下 + +**分享邀请码/邀请链接** + + + + +**受邀者注册** + + # API列表@api - -## 基础功能 + +## 基础功能 ### 用户注册 @register @@ -349,7 +490,7 @@ exports.main = async function(event,context) { }) return res } -``` +``` ### 登出 @@ -576,7 +717,7 @@ exports.main = async function(event,context) { } ``` - + ### 更新用户信息 @@ -613,8 +754,8 @@ exports.main = async function(event,context) { return res } ``` - -### 获取用户信息 + +### 获取用户信息 用法:`uniID.getUserInfo(Object GetUserInfoParams);` @@ -632,7 +773,7 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功| -| message | String| 是 |详细信息 | +| message | String| 是 |详细信息 | | userInfo| Object| 是 |获取的用户信息 | ```js @@ -649,7 +790,7 @@ exports.main = async function(event,context) { }) return res } -``` +``` ### 自行初始化uni-id@init @@ -694,9 +835,9 @@ exports.main = async function(event,context) { }) return res } -``` - -## 手机号码 +``` + +## 手机号码 ### 发送短信验证码 @@ -710,11 +851,11 @@ exports.main = async function(event,context) { | templateId| String| 否 |`uni-id 1.1.8+`用户自定义模板Id,不传则使用uniID_code,如果要使用自定义模板请使用类似下面模板示例的参数 | | code | String| 否 |验证码字符串 | | type | String| 是 |类型,用于防止不同功能的验证码混用,目前支持的类型`login`登录、`register`注册、`bind`绑定手机、`unbind`解绑手机| - -``` -// 短信模板示例,请在https://dev.dcloud.net.cn/uniSms申请签名(短信开头中括号内部分)及模板 -验证码:${code},用于${action},${expMinute}分钟内有效,请勿泄露并尽快验证。 -``` + +``` +// 短信模板示例,请在https://dev.dcloud.net.cn/uniSms申请签名(短信开头中括号内部分)及模板 +验证码:${code},用于${action},${expMinute}分钟内有效,请勿泄露并尽快验证。 +``` **响应参数** @@ -842,10 +983,10 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | mobile | String| 是 |用户手机号 | -| code | String| 是 |验证码 | -| type | String| 否 |指定操作类型,可选值为`login`、`register`,不传此参数时表现为手机号已注册则登录,手机号未注册则进行注册| -| password |String | 否 |密码,type为`register`时生效 | -| inviteCode |String | 否 |邀请人的邀请码,type为`register`时生效 | +| code | String| 是 |验证码 | +| type | String| 否 |指定操作类型,可选值为`login`、`register`,不传此参数时表现为手机号已注册则登录,手机号未注册则进行注册| +| password |String | 否 |密码,type为`register`时生效 | +| inviteCode |String | 否 |邀请人的邀请码,type为`register`时生效 | | myInviteCode|String | 否 |设置当前注册用户自己的邀请码,type为`register`时生效 | | needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 | @@ -965,8 +1106,8 @@ exports.main = async function(event,context) { } ``` - -## 邮箱 + +## 邮箱 ### 邮箱验证码直接登录 @@ -977,9 +1118,9 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | email | String| 是 |用户邮箱 | -| code | String| 是 |验证码 | -| type | String| 否 |指定操作类型,覆盖存在则登录不存在则注册的默认行为,可选值为`login`、`register`| -| password |String | 否 |密码,type为`register`时生效 | +| code | String| 是 |验证码 | +| type | String| 否 |指定操作类型,覆盖存在则登录不存在则注册的默认行为,可选值为`login`、`register`| +| password |String | 否 |密码,type为`register`时生效 | | myInviteCode |String | 否 |设置当前注册用户自己的邀请码,type为`register`时生效 | | needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 | @@ -1013,14 +1154,14 @@ exports.main = async function(event,context) { } ``` - -### 设置验证码 - -见[设置验证码](uniCloud/uni-id.md?id=setVerifyCode) - -### 校验验证码 - -见[校验验证码](uniCloud/uni-id.md?id=verifyCode) + +### 设置验证码 + +见[设置验证码](uniCloud/uni-id.md?id=setVerifyCode) + +### 校验验证码 + +见[校验验证码](uniCloud/uni-id.md?id=verifyCode) ### 绑定邮箱 @@ -1107,8 +1248,8 @@ exports.main = async function(event,context) { return res } ``` - -## 微信小程序 + +## 微信小程序 ### 微信登录 @@ -1125,8 +1266,8 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | -| code | String| 是 |微信登录返回的code | -| platform |String | 否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 | +| code | String| 是 |微信登录返回的code | +| platform |String | 否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 | | myInviteCode|String | 否 |设置当前注册用户自己的邀请码,type为`register`时生效 | | needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 | @@ -1151,11 +1292,11 @@ exports.main = async function(event,context) { ```js // 云函数login-by-weixin代码 const uniID = require('uni-id') -exports.main = async function(event,context) { +exports.main = async function(event,context) { // 如下旧写法依然支持 // const res = await uniID.loginByWeixin(event.code) - const res = await uniID.loginByWeixin({ - code: event.code + const res = await uniID.loginByWeixin({ + code: event.code }) return res } @@ -1241,7 +1382,7 @@ export default { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | -| code | String| 是 |微信登录返回的code | +| code | String| 是 |微信登录返回的code | |platform |String |否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 | **响应参数** @@ -1266,7 +1407,7 @@ exports.main = async function(event,context) { }) return res } -``` +``` ### 绑定微信 @@ -1279,7 +1420,7 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | uid | String| 是 |用户Id,可以通过checkToken返回 | -| code | String| 是 |微信登录返回的code | +| code | String| 是 |微信登录返回的code | |platform |String |否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 | **响应参数** @@ -1334,8 +1475,8 @@ exports.main = async function(event,context) { return res } ``` - -## 支付宝小程序 + +## 支付宝小程序 ### 支付宝登录 @@ -1350,10 +1491,10 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | -| code | String| 是 |支付宝登录返回的code | -| platform | String| 否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 | +| code | String| 是 |支付宝登录返回的code | +| platform | String| 否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 | | myInviteCode| String| 否 |设置当前注册用户自己的邀请码,type为`register`时生效 | -| needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 | +| needPermission| Boolean | 否 |设置为true时会在checkToken时返回用户权限(permission),建议在管理控制台中使用 | **响应参数** @@ -1375,16 +1516,16 @@ exports.main = async function(event,context) { ```js // 云函数代码 const uniID = require('uni-id') -exports.main = async function(event,context) { +exports.main = async function(event,context) { // 如下旧写法依然支持 // const res = await uniID.loginByAlipay(event.code) - const res = await uniID.loginByAlipay({ - code: event.code + const res = await uniID.loginByAlipay({ + code: event.code }) return res } ``` - + ### 获取支付宝用户ID @@ -1394,7 +1535,7 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | -| code | String| 是 |微信登录返回的code | +| code | String| 是 |微信登录返回的code | |platform |String |否 |客户端类型:`mp-weixin`、`app-plus`,默认uni-id会自动取客户端类型,但是在云函数url化等场景无法取到客户端类型,可以使用此参数指定 | **响应参数** @@ -1418,7 +1559,7 @@ exports.main = async function(event,context) { }) return res } -``` +``` ### 绑定支付宝 @@ -1485,14 +1626,14 @@ exports.main = async function(event,context) { return res } ``` - -## 角色权限@rbac-api - -### 获取用户角色 - -根据uid获取用户角色 - -用法:`uniID.getRoleByUid(Object GetRoleByUidParams)` + +## 角色权限@rbac-api + +### 获取用户角色 + +根据uid获取用户角色 + +用法:`uniID.getRoleByUid(Object GetRoleByUidParams)` **参数说明** @@ -1505,14 +1646,14 @@ exports.main = async function(event,context) { | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| message | String| 是 |详细信息 | -| role | Array | 是 |用户拥有的角色列表| - -### 获取角色的权限 - -根据roleID获取角色权限 - -用法:`uniID.getPermissionByRole(Object GetPermissionByRoleParams)` +| message | String| 是 |详细信息 | +| role | Array | 是 |用户拥有的角色列表| + +### 获取角色的权限 + +根据roleID获取角色权限 + +用法:`uniID.getPermissionByRole(Object GetPermissionByRoleParams)` **参数说明** @@ -1525,14 +1666,14 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | -| permission| Array | 是 |角色拥有的权限列表 | - -### 获取用户的权限 - -根据uid获取用户权限 - -用法:`uniID.getPermissionByUid(Object GetPermissionByUidParams)` +| message | String| 是 |详细信息 | +| permission| Array | 是 |角色拥有的权限列表 | + +### 获取用户的权限 + +根据uid获取用户权限 + +用法:`uniID.getPermissionByUid(Object GetPermissionByUidParams)` **参数说明** @@ -1545,12 +1686,12 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | -| permission| Array | 是 |用户拥有的权限列表 | - -### 为用户绑定角色 - -用法:`uniID.bindRole(Object BindRoleParams)` +| message | String| 是 |详细信息 | +| permission| Array | 是 |用户拥有的权限列表 | + +### 为用户绑定角色 + +用法:`uniID.bindRole(Object BindRoleParams)` **参数说明** @@ -1565,11 +1706,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 为角色绑定权限 - -用法:`uniID.bindPermission(Object BindPermissionParams)` +| message | String| 是 |详细信息 | + +### 为角色绑定权限 + +用法:`uniID.bindPermission(Object BindPermissionParams)` **参数说明** @@ -1584,11 +1725,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 为用户解绑角色 - -用法:`uniID.unbindRole(Object UnbindRoleParams)` +| message | String| 是 |详细信息 | + +### 为用户解绑角色 + +用法:`uniID.unbindRole(Object UnbindRoleParams)` **参数说明** @@ -1602,11 +1743,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 为角色解绑权限 - -用法:`uniID.unbindPermission(Object UnbindPermissionParams)` +| message | String| 是 |详细信息 | + +### 为角色解绑权限 + +用法:`uniID.unbindPermission(Object UnbindPermissionParams)` **参数说明** @@ -1620,11 +1761,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 新增角色 - -用法:`uniID.addRole(Object AddRoleParams)` +| message | String| 是 |详细信息 | + +### 新增角色 + +用法:`uniID.addRole(Object AddRoleParams)` **参数说明** @@ -1640,11 +1781,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 获取角色列表 - -用法:`uniID.getRoleList(Object GetRoleListParams)` +| message | String| 是 |详细信息 | + +### 获取角色列表 + +用法:`uniID.getRoleList(Object GetRoleListParams)` **参数说明** @@ -1659,15 +1800,15 @@ exports.main = async function(event,context) { | 字段 | 类型 | 说明 | | --- | --- | --- | | code | Number| 错误码,0表示成功 | -| message | String| 详细信息 | -| roleList| Array |roles表记录数组(包含role_name、comment等)| -| total | Number|总数量 | - -### 更新角色信息 - -**注意不可修改role_id** - -用法:`uniID.updateRole(Object UpdateRoleParams)` +| message | String| 详细信息 | +| roleList| Array |roles表记录数组(包含role_name、comment等)| +| total | Number|总数量 | + +### 更新角色信息 + +**注意不可修改role_id** + +用法:`uniID.updateRole(Object UpdateRoleParams)` **参数说明** @@ -1683,11 +1824,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 删除角色 - -用法:`uniID.deleteRole(Object DeleteRoleParams)` +| message | String| 是 |详细信息 | + +### 删除角色 + +用法:`uniID.deleteRole(Object DeleteRoleParams)` **参数说明** @@ -1700,11 +1841,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 新增权限 - -用法:`uniID.addPermission(Object AddPermissionParams)` +| message | String| 是 |详细信息 | + +### 新增权限 + +用法:`uniID.addPermission(Object AddPermissionParams)` **参数说明** @@ -1719,11 +1860,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 获取权限列表 - -用法:`uniID.getPermissionList(Object GetPermissionListParams)` +| message | String| 是 |详细信息 | + +### 获取权限列表 + +用法:`uniID.getPermissionList(Object GetPermissionListParams)` **参数说明** @@ -1738,15 +1879,15 @@ exports.main = async function(event,context) { | 字段 | 类型 | 说明 | | --- | --- | --- | | code | Number| 错误码,0表示成功 | -| message | String| 详细信息 | -| permissionList| Array |permissions表记录数组(包含permission_name、comment等)| -| total | Number|总数量 | - -### 修改权限 - -**注意:不可修改permissionID** - -用法:`uniID.updatePermission(Object UpdatePermissionParams)` +| message | String| 详细信息 | +| permissionList| Array |permissions表记录数组(包含permission_name、comment等)| +| total | Number|总数量 | + +### 修改权限 + +**注意:不可修改permissionID** + +用法:`uniID.updatePermission(Object UpdatePermissionParams)` **参数说明** @@ -1761,11 +1902,11 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -### 删除权限 - -用法:`uniID.deletePermission(Object DeletePermissionParams)` +| message | String| 是 |详细信息 | + +### 删除权限 + +用法:`uniID.deletePermission(Object DeletePermissionParams)` **参数说明** @@ -1778,13 +1919,13 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功 | -| message | String| 是 |详细信息 | - -## 裂变@fission-api - -### 设置用户邀请码 - -针对未生成邀请码的用户使用此方法生成邀请码 +| message | String| 是 |详细信息 | + +## 裂变@fission-api + +### 设置用户邀请码 + +针对未生成邀请码的用户使用此方法生成邀请码 用法:`uniID.setUserInviteCode(Object SetUserInviteCodeParams);` @@ -1802,12 +1943,12 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功| -| message | String| 是 |详细信息 | -| myInviteCode| String| 是 |最终设置的邀请码 | - -### 用户接受邀请 +| message | String| 是 |详细信息 | +| myInviteCode| String| 是 |最终设置的邀请码 | + +### 用户接受邀请 -此接口用于在注册之后再填写邀请码的场景,多数情况下不会用到此接口而是在注册时填写邀请码 +此接口用于在注册之后再填写邀请码的场景,多数情况下不会用到此接口而是在注册时填写邀请码 用法:`uniID.acceptInvite(Object AcceptInviteParams);` @@ -1824,8 +1965,8 @@ exports.main = async function(event,context) { | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功| | message | String| 是 |详细信息 | - -### 获取接受邀请的用户清单 + +### 获取接受邀请的用户清单 用法:`uniID.getInvitedUser(Object GetInvitedUserParams);` @@ -1846,16 +1987,16 @@ exports.main = async function(event,context) { | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | code | Number| 是 |错误码,0表示成功| -| message | String| 是 |详细信息 | -| invitedUser | Array | 是 |邀请的用户列表 | - -**invitedUser每项结构** +| message | String| 是 |详细信息 | +| invitedUser | Array | 是 |邀请的用户列表 | + +**invitedUser每项结构** | 字段 | 类型 | 必填| 说明 | -| --- | --- | --- | --- | -| username |String |- |被邀请者用户名 | -| mobile |String |- |被邀请者手机号 | -| invite_time |String |- |被邀请者注册时间,以时间戳形式返回 | +| --- | --- | --- | --- | +| username |String |- |被邀请者用户名 | +| mobile |String |- |被邀请者手机号 | +| invite_time |String |- |被邀请者注册时间,以时间戳形式返回 | ```js // 云函数代码 @@ -1867,13 +2008,13 @@ exports.main = async function(event,context) { } const res = await uniID.getUserInfo({ uid: payload.uid, - limit: 10, - offset: 0, + limit: 10, + offset: 0, needTotal: true }) return res } -``` +``` # 数据库结构 @@ -1881,31 +2022,31 @@ exports.main = async function(event,context) { 表名:uni-id-users -| 字段 | 类型 | 必填| 描述 | -| ----------------| --------- | ----| ------------------------------------------- | -| \_id | Object ID | 是 | 存储文档 ID(用户 ID),系统自动生成 | -| username | String | 是 | 用户名,不允许重复 | -| password | String | 否 | 密码,加密存储 | -| nickname | String | 否 | 用户昵称 | -| gender | Integer | 否 | 用户性别:0 未知 1 男性 2 女性 | -| status | Integer | 是 | 用户状态:0 正常 1 禁用 2 审核中 3 审核拒绝 | -| mobile | String | 否 | 手机号码 | -| mobile_confirmed| Integer | 否 | 手机号验证状态:0 未验证 1 已验证 | -| email | String | 否 | 邮箱地址 | -| email_confirmed | Integer | 否 | 邮箱验证状态:0 未验证 1 已验证 | -| avatar | String | 否 | 头像地址 | -| wx_unionid | String | 否 | 微信unionid | -| wx_openid | Object | 否 | 微信各个平台openid | -| ali_openid | String | 否 | 支付宝平台openid | -| comment | String | 否 | 备注 | -| realname_auth | Object | 否 | 实名认证信息 | -| register_date | Timestamp | 否 | 注册时间 | -| register_ip | String | 否 | 注册时 IP 地址 | -| last_login_date | Timestamp | 否 | 最后登录时间 | -| last_login_ip | String | 否 | 最后登录时 IP 地址 | -| login_ip_limit | Array | 否 | 登录 IP 限制 | -| inviter_uid | Array | 否 | 邀请人uid,按层级从下往上排列的uid数组,即第一个是直接上级| -| my_invite_code | String | 否 | 用户自己的邀请码 | +| 字段 | 类型 | 必填| 描述 | +| ----------------| --------- | ----| ------------------------------------------- | +| \_id | Object ID | 是 | 存储文档 ID(用户 ID),系统自动生成 | +| username | String | 是 | 用户名,不允许重复 | +| password | String | 否 | 密码,加密存储 | +| nickname | String | 否 | 用户昵称 | +| gender | Integer | 否 | 用户性别:0 未知 1 男性 2 女性 | +| status | Integer | 是 | 用户状态:0 正常 1 禁用 2 审核中 3 审核拒绝 | +| mobile | String | 否 | 手机号码 | +| mobile_confirmed| Integer | 否 | 手机号验证状态:0 未验证 1 已验证 | +| email | String | 否 | 邮箱地址 | +| email_confirmed | Integer | 否 | 邮箱验证状态:0 未验证 1 已验证 | +| avatar | String | 否 | 头像地址 | +| wx_unionid | String | 否 | 微信unionid | +| wx_openid | Object | 否 | 微信各个平台openid | +| ali_openid | String | 否 | 支付宝平台openid | +| comment | String | 否 | 备注 | +| realname_auth | Object | 否 | 实名认证信息 | +| register_date | Timestamp | 否 | 注册时间 | +| register_ip | String | 否 | 注册时 IP 地址 | +| last_login_date | Timestamp | 否 | 最后登录时间 | +| last_login_ip | String | 否 | 最后登录时 IP 地址 | +| login_ip_limit | Array | 否 | 登录 IP 限制 | +| inviter_uid | Array | 否 | 邀请人uid,按层级从下往上排列的uid数组,即第一个是直接上级| +| my_invite_code | String | 否 | 用户自己的邀请码 | | role | Array | 否 | 用户角色列表,由role_id组成的数组 | **wx_openid字段定义** @@ -1974,7 +2115,7 @@ exports.main = async function(event,context) { | ip | String | 是 | 请求时 IP 地址 | | created_at | Timestamp | 是 | 创建时间 | | expired_at | Timestamp | 是 | 验证码过期时间 | - + ## 角色表 表名:`uni-id-roles` @@ -1986,8 +2127,8 @@ exports.main = async function(event,context) { | role_name | String | 否 | 角色名,展示用 | | permission | Array | 是 | 角色拥有的权限列表 | | comment | String | 否 | 备注 | -| created_date| Timestamp | 是 | 角色创建时间 | - +| created_date| Timestamp | 是 | 角色创建时间 | + ## 权限表 表名:`uni-id-permissions` @@ -1998,72 +2139,72 @@ exports.main = async function(event,context) { | permission_id | String | 是 | 权限唯一标识 | | permission_name | String | 否 | 权限名,展示用 | | comment | String | 否 | 备注 | -| created_date | Timestamp | 是 | 权限创建时间 | +| created_date | Timestamp | 是 | 权限创建时间 | # 错误码 自`1.1.0`版本使用此错误码规范 -|模块 |模块码 |错误代码 |错误信息 | -|:-: |:-: |:-: |:-: | -|登录通用模块 |100 |01 |账号已禁用 | -|账号、邮箱、手机+密码登录 |101 |01 |用户不存在 | -| | |02 |密码错误 | -| | |03 |密码错误次数过多 | -|手机号验证码登录/注册 |102 |01 |手机号已存在(传入type='register'且手机号已注册时触发)| -| |102 |02 |此手机号尚未注册(传入type='login'且手机号未注册时触发) | -| |102 |03 |邀请码无效(邀请码存在且唯一时才算有效) | -|邮箱验证码登录/注册 |103 |01 |此邮箱已注册(传入type='register'且邮箱已注册时触发)| -| |103 |02 |此邮箱尚未注册(传入type='login'且邮箱未注册时触发) | -|微信登录/注册 |104 |01 |获取openid失败 | -|支付宝登录/注册 |105 |01 |获取openid失败 | -|注册通用模块 |200 |- |- | -|账号、邮箱、手机+密码注册 |201 |01 |用户名、邮箱、手机号必填一项 | -| | |02 |用户名、邮箱、手机号冲突 | -|Token类 |300 |- |- | -|生成Token |301 |- |- | -|验证Token |302 |01 |设备特征校验未通过 | -| | |02 |云端已不包含此token | -| | |03 |token已过期 | -| | |04 |token校验未通过 | -|账号安全类 |400 |- |- | -|登出 |401 |- |- | -|修改密码 |402 |01 |用户不存在 | -| | |02 |旧密码错误 | -|重置密码 |403 |- |- | -|验证类 |500 |- |- | -|设置验证码 |501 |01 |参数错误 | -|校验验证码 |502 |01 |参数错误 | -| | |02 |验证码错误或已失效 | -|发送短信验证码 |503 |01 |验证码发送失败,一般message内有描述 | -|绑定账号 |600 |- |- | -|绑定手机号 |601 |01 |此手机号已被绑定 | -|绑定邮箱 |602 |01 |此邮箱已被绑定 | -|绑定微信 |603 |01 |获取openid失败 | -| | |02 |此账号已被绑定 | -|绑定支付宝 |604 |01 |获取openid失败 | -| | |02 |此账号已被绑定 | -|解绑账号 |700 |- |- | -|解绑手机号 |701 |01 |解绑失败,可能已经解绑或者账号不匹配 | -|解绑邮箱 |702 |01 |解绑失败,可能已经解绑或者账号不匹配 | -|解绑微信 |703 |01 |解绑失败,可能已经解绑 | -|解绑支付宝 |704 |01 |解绑失败,可能已经解绑 | -|基础功能 |800 |- |- | -|更新用户信息 |801 |01 |参数错误 | -|设置头像 |802 |- |- | -|获取用户信息 |803 |01 |未查询到用户信息 | -|设置用户自己的邀请码 |804 |01 |邀请码设置失败,验证码重复或自动设置重试多次依然重复 | -| | |02 |邀请码重试多次依然重复 | -|填写邀请人邀请码 |805 |01 |邀请码无效(邀请码存在且唯一时才算有效) | -| | |02 |uid错误,用户不存在 | -| | |03 |邀请码不可修改 | -|获取微信openid |806 |01 |未能获取openid | -| | |02 |调用获取openid接口失败 | -|获取支付宝openid |807 |01 |未能获取openid | -| | |02 |调用获取openid接口失败 | +|模块 |模块码 |错误代码 |错误信息 | +|:-: |:-: |:-: |:-: | +|登录通用模块 |100 |01 |账号已禁用 | +|账号、邮箱、手机+密码登录 |101 |01 |用户不存在 | +| | |02 |密码错误 | +| | |03 |密码错误次数过多 | +|手机号验证码登录/注册 |102 |01 |手机号已存在(传入type='register'且手机号已注册时触发)| +| |102 |02 |此手机号尚未注册(传入type='login'且手机号未注册时触发) | +| |102 |03 |邀请码无效(邀请码存在且唯一时才算有效) | +|邮箱验证码登录/注册 |103 |01 |此邮箱已注册(传入type='register'且邮箱已注册时触发)| +| |103 |02 |此邮箱尚未注册(传入type='login'且邮箱未注册时触发) | +|微信登录/注册 |104 |01 |获取openid失败 | +|支付宝登录/注册 |105 |01 |获取openid失败 | +|注册通用模块 |200 |- |- | +|账号、邮箱、手机+密码注册 |201 |01 |用户名、邮箱、手机号必填一项 | +| | |02 |用户名、邮箱、手机号冲突 | +|Token类 |300 |- |- | +|生成Token |301 |- |- | +|验证Token |302 |01 |设备特征校验未通过 | +| | |02 |云端已不包含此token | +| | |03 |token已过期 | +| | |04 |token校验未通过 | +|账号安全类 |400 |- |- | +|登出 |401 |- |- | +|修改密码 |402 |01 |用户不存在 | +| | |02 |旧密码错误 | +|重置密码 |403 |- |- | +|验证类 |500 |- |- | +|设置验证码 |501 |01 |参数错误 | +|校验验证码 |502 |01 |参数错误 | +| | |02 |验证码错误或已失效 | +|发送短信验证码 |503 |01 |验证码发送失败,一般message内有描述 | +|绑定账号 |600 |- |- | +|绑定手机号 |601 |01 |此手机号已被绑定 | +|绑定邮箱 |602 |01 |此邮箱已被绑定 | +|绑定微信 |603 |01 |获取openid失败 | +| | |02 |此账号已被绑定 | +|绑定支付宝 |604 |01 |获取openid失败 | +| | |02 |此账号已被绑定 | +|解绑账号 |700 |- |- | +|解绑手机号 |701 |01 |解绑失败,可能已经解绑或者账号不匹配 | +|解绑邮箱 |702 |01 |解绑失败,可能已经解绑或者账号不匹配 | +|解绑微信 |703 |01 |解绑失败,可能已经解绑 | +|解绑支付宝 |704 |01 |解绑失败,可能已经解绑 | +|基础功能 |800 |- |- | +|更新用户信息 |801 |01 |参数错误 | +|设置头像 |802 |- |- | +|获取用户信息 |803 |01 |未查询到用户信息 | +|设置用户自己的邀请码 |804 |01 |邀请码设置失败,验证码重复或自动设置重试多次依然重复 | +| | |02 |邀请码重试多次依然重复 | +|填写邀请人邀请码 |805 |01 |邀请码无效(邀请码存在且唯一时才算有效) | +| | |02 |uid错误,用户不存在 | +| | |03 |邀请码不可修改 | +|获取微信openid |806 |01 |未能获取openid | +| | |02 |调用获取openid接口失败 | +|获取支付宝openid |807 |01 |未能获取openid | +| | |02 |调用获取openid接口失败 | |公用码 |900 |01 |数据库读写异常 | - -**另外还有一些字符串类型的扩展错误码在各自接口的文档中展示,请不要直接使用`code>0`这种方式来判断是否有错误** + +**另外还有一些字符串类型的扩展错误码在各自接口的文档中展示,请不要直接使用`code>0`这种方式来判断是否有错误** # FAQ @@ -2074,7 +2215,7 @@ exports.main = async function(event,context) { + uni-id内会校验客户端ua,如果是在本地调试可以在云函数内修改`context.CLIENTUA`为生成token的设备ua,切记上线删除此逻辑。如果不需要设备和token绑定,可以在config内配置`bindTokenToDevice: false`来关闭绑定 - username、email、mobile三个字段 - + 三个字段均可能为空,但是建议限制一下插入数据库三个字段的格式,比如username不应是邮箱格式或手机号格式,因为登录时可以选择使用username或mobile或email+密码的方式 - -- 关于邀请码 - + 目前仅手机号+验证码的注册方式支持填写邀请码 \ No newline at end of file + + 三个字段均可能为空,但是建议限制一下插入数据库三个字段的格式,比如username不应是邮箱格式或手机号格式,因为登录时可以选择使用username或mobile或email+密码的方式 + +- 关于邀请码 + + 目前仅手机号+验证码的注册方式支持填写邀请码