diff --git a/docs/uniCloud/uni-id.md b/docs/uniCloud/uni-id.md index 48d2cda52bddb1cad0366a600498326b072637ea..e428c1748182b0a13182633d8e10b9cc5cad7466 100644 --- a/docs/uniCloud/uni-id.md +++ b/docs/uniCloud/uni-id.md @@ -10,9 +10,9 @@ `uni-id`可成为开发者应用的用户中心,在插件市场获取更多基于`uni-id`的业务模板,集成到你的应用中。 -# uni-id组成部分 +# uni-id组成部分 -`uni-id`包括如下组成部分: +`uni-id`包括如下组成部分: 1. 云数据库 @@ -45,56 +45,65 @@ 5. 按照[公用模块使用说明](https://uniapp.dcloud.io/uniCloud/cf-common)在云函数下安装`uni-id`模块 或者直接导入[uni-id在插件市场的示例工程](https://ext.dcloud.net.cn/plugin?id=2116) - -**config.json的说明** - -注意:**config.json是一个标准json文件,不支持注释** - -配置项: - + +**config.json的说明** + +注意:**config.json是一个标准json文件,不支持注释** + +配置项: + + `passwordSecret`为用于加密密码入库的密钥 + `tokenSecret`为生成token需要的密钥 -+ `tokenExpiresIn`token有效期,以秒为单位 -+ `passwordErrorLimit`密码错误重试次数,分ip记录密码错误次数,达到重试次数之后等待`passwordErrorRetryTime`时间之后才可以重试 -+ `passwordErrorRetryTime`单位为秒 -+ 如果使用`sendSmsCode`接口发送短信需要配置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过期时间 - "passwordErrorLimit": 6, // 同一个ip密码错误最大重试次数 - "passwordErrorRetryTime": 3600, // 超过密码重试次数之后的等待时间 - "service": { - "sms": { - "name": "DCloud", // 应用名称对应uniCloud.sendSms的data参数内的name - "codeExpiresIn": 180, // 验证码过期时间,单位:秒,只可取60的整数倍,不填此参数时会取默认值180秒 - "smsKey": "your sms key", // 短信密钥key - "smsSecret": "your sms secret" // 短信密钥secret - } - }, - "mp-weixin":{ - "oauth":{ - "weixin": { - "appid": "your mp-weixin appid", // 微信小程序appid - "appsecret": "your mp-weixin appsecret", // 微信小程序appsecret - } - } - }, - "app-plus": { - "tokenExpiresIn": 2592000, // App平台token过期时间 - "oauth":{ - "weixin": { - "appid": "your app-weixin appid", // app平台对应的微信开放平台appid - "appsecret": "your app-weixin appsecret", // app平台对应的微信开放平台appsecret - } - } - } -} -``` ++ `tokenExpiresIn`token有效期,以秒为单位 ++ `passwordErrorLimit`密码错误重试次数,分ip记录密码错误次数,达到重试次数之后等待`passwordErrorRetryTime`时间之后才可以重试 ++ `passwordErrorRetryTime`单位为秒 ++ 如果使用`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", + "tokenExpiresIn": 7200, + "passwordErrorLimit": 6, + "passwordErrorRetryTime": 3600, + "app-plus": { + "tokenExpiresIn": 2592000, + "oauth": { + "weixin": { + "appid": "weixin appid", + "appsecret": "weixin appsecret" + } + } + }, + "mp-weixin": { + "oauth": { + "weixin": { + "appid": "weixin appid", + "appsecret": "weixin appsecret" + } + } + }, + "mp-alipay": { + "oauth": { + "alipay": { + "appid": "alipay appid", + "privateKey": "alipay privateKey" + } + } + }, + "service": { + "sms": { + "name": "your app name", // 应用名称,对应短信模版的name + "codeExpiresIn": 180, // 验证码过期时间,单位为秒,注意一定要是60的整数倍 + "smsKey": "your sms key", // 短信密钥key,开通短信服务处可以看到 + "smsSecret": "your sms secret" // 短信密钥secret,开通短信服务处可以看到 + } + } +} +``` # API列表 @@ -219,7 +228,7 @@ exports.main = async function(event,context) { // username、password验证是否合法的逻辑 const res = await uniID.login({ username, - password, + password, queryField: ['username', 'email', 'mobile'] }) return res @@ -291,14 +300,14 @@ exports.main = async function(event,context) { newPassword, passwordConfirmation } = event - // 校验新密码与确认新密码是否一致 - - const payload = await uniID.checkToken(event.uniIdToken) - if(payload.code > 0) { - return payload - } + // 校验新密码与确认新密码是否一致 + + const payload = await uniID.checkToken(event.uniIdToken) + if(payload.code > 0) { + return payload + } - const res = await uniID.updatePwd({ + const res = await uniID.updatePwd({ uid: payload.uid, oldPassword, newPassword, @@ -331,19 +340,19 @@ exports.main = async function(event,context) { ```js // 云函数代码 const uniID = require('uni-id') -exports.main = async function(event,context) { - const payload = await uniID.checkToken(event.uniIdToken) - if(payload.code > 0) { - return payload - } +exports.main = async function(event,context) { + const payload = await uniID.checkToken(event.uniIdToken) + if(payload.code > 0) { + return payload + } - const res = await uniID.resetPwd({ + const res = await uniID.resetPwd({ uid: payload.uid, password: '12345678' }) return res } -``` +``` ## 加密密码 @encrypt-password @@ -368,11 +377,11 @@ exports.main = async function(event,context) { const uniID = require('uni-id') exports.main = async function(event,context) { const encResult = await uniID.encryptPwd('123456') - return { - encResult + return { + encResult } } -``` +``` ## 设置头像 @@ -400,12 +409,12 @@ const uniID = require('uni-id') exports.main = async function(event,context) { const { avatar - } = event - const payload = await uniID.checkToken(event.uniIdToken) - if(payload.code > 0) { - return payload + } = event + const payload = await uniID.checkToken(event.uniIdToken) + if(payload.code > 0) { + return payload } - const res = await uniID.setAvatar({ + const res = await uniID.setAvatar({ uid: payload.uid, avatar }) @@ -413,25 +422,25 @@ exports.main = async function(event,context) { } ``` - -## 发送短信验证码 - -用法:`uniID.sendSmsCode(Object codeInfo)` - -**codeInfo**参数说明 + +## 发送短信验证码 + +用法:`uniID.sendSmsCode(Object codeInfo)` + +**codeInfo**参数说明 | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | mobile| String| 是 |用户手机号 | | code | String| 是 |验证码字符串 | -| type | String| 是 |类型,用于防止不同功能的验证码混用,目前支持的类型`login`登录、`bind`绑定手机、`unbind`解绑手机 | +| type | String| 是 |类型,用于防止不同功能的验证码混用,目前支持的类型`login`登录、`bind`绑定手机、`unbind`解绑手机 | **响应参数** | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| msg | String| 是 |详细信息 | +| msg | String| 是 |详细信息 | **示例代码** @@ -441,42 +450,42 @@ const uniID = require('uni-id') exports.main = async function(event,context) { const { mobile - } = event - // 生成验证码可以按自己的需求来,这里以生成6位数字为例 - const randomStr = '00000' + Math.floor(Math.random() * 1000000) + } = event + // 生成验证码可以按自己的需求来,这里以生成6位数字为例 + const randomStr = '00000' + Math.floor(Math.random() * 1000000) const code = randomStr.substring(randomStr.length - 6) const res = await uniID.sendSmsCode({ - mobile, - code, + mobile, + code, type: 'login' }) return res } -``` - -## 设置验证码 - -如果你不想使用`uni-id`的sendSmsCode发送短信的话,可以使用此接口自行在库中创建验证码 - -用法:`uniID.setVerifyCode(Object codeInfo)` - -**codeInfo**参数说明 +``` + +## 设置验证码 + +如果你不想使用`uni-id`的sendSmsCode发送短信的话,可以使用此接口自行在库中创建验证码 + +用法:`uniID.setVerifyCode(Object codeInfo)` + +**codeInfo**参数说明 | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | mobile | String| 是 |用户手机号,和邮箱二选一 | | email | String| 是 |用户邮箱,和手机号二选一 | -| code | String| 是 |验证码字符串 | +| code | String| 是 |验证码字符串 | | expiresIn | Number| 是 |验证码过期时间,单位秒 | -| type | String| 是 |类型,用于防止不同功能的验证码混用,目前支持的类型`login`登录、`bind`绑定手机、`unbind`解绑手机| +| type | String| 是 |类型,用于防止不同功能的验证码混用,目前支持的类型`login`登录、`bind`绑定手机、`unbind`解绑手机| **响应参数** | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| msg | String| 是 |详细信息 | +| msg | String| 是 |详细信息 | **示例代码** @@ -486,42 +495,42 @@ const uniID = require('uni-id') exports.main = async function(event,context) { const { mobile - } = event - // 生成验证码可以按自己的需求来,这里以生成6位数字为例 - const randomStr = '00000' + Math.floor(Math.random() * 1000000) + } = event + // 生成验证码可以按自己的需求来,这里以生成6位数字为例 + const randomStr = '00000' + Math.floor(Math.random() * 1000000) const code = randomStr.substring(randomStr.length - 6) const res = await uniID.setVerifyCode({ - mobile, - code, - expiresIn: 180, + mobile, + code, + expiresIn: 180, type: 'login' }) return res } -``` - -## 校验验证码 - -uni-id内置方法`loginBySms`、`bindMobile`、`unbindMobile`均已内置校验验证码方法,如果使用以上方法不需要再调用此接口,如需扩展类型请确保type和发送验证码/设置验证码时对应 - -用法:`uniID.verifyCode(Object codeInfo)` - -**codeInfo**参数说明 +``` + +## 校验验证码 + +uni-id内置方法`loginBySms`、`bindMobile`、`unbindMobile`均已内置校验验证码方法,如果使用以上方法不需要再调用此接口,如需扩展类型请确保type和发送验证码/设置验证码时对应 + +用法:`uniID.verifyCode(Object codeInfo)` + +**codeInfo**参数说明 | 字段 | 类型 | 必填| 说明 | | --- | --- | --- | --- | | mobile| String| 是 |用户手机号,和邮箱二选一 | -| email | String| 是 |用户邮箱,和手机号二选一 | +| email | String| 是 |用户邮箱,和手机号二选一 | | code | String| 是 |验证码字符串 | -| type | String| 是 |类型,用于防止不同功能的验证码混用,目前支持的类型`login`登录、`bind`绑定手机、`unbind`解绑手机| +| type | String| 是 |类型,用于防止不同功能的验证码混用,目前支持的类型`login`登录、`bind`绑定手机、`unbind`解绑手机| **响应参数** | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| msg | String| 是 |详细信息 | +| msg | String| 是 |详细信息 | **示例代码** @@ -530,22 +539,22 @@ uni-id内置方法`loginBySms`、`bindMobile`、`unbindMobile`均已内置校验 const uniID = require('uni-id') exports.main = async function(event,context) { const { - mobile, + mobile, code } = event const res = await uniID.verifyCode({ - mobile, - code, + mobile, + code, type: 'login' }) return res } -``` - -## 手机号验证码直接登录 - -用法:`uniID.loginBySms(Object mobileInfo)` +``` + +## 手机号验证码直接登录 + +用法:`uniID.loginBySms(Object mobileInfo)` **mobileInfo**参数说明 @@ -570,17 +579,17 @@ exports.main = async function(event,context) { const uniID = require('uni-id') exports.main = async function(event,context) { const { - mobile, + mobile, code } = event const res = await uniID.loginBySms({ - mobile, + mobile, code }) return res } -``` +``` ## 绑定手机号 @@ -608,24 +617,24 @@ exports.main = async function(event,context) { const uniID = require('uni-id') exports.main = async function(event,context) { const { - mobile, + mobile, code - } = event - const payload = await uniID.checkToken(event.uniIdToken) - if(payload.code > 0) { - return payload + } = event + const payload = await uniID.checkToken(event.uniIdToken) + if(payload.code > 0) { + return payload } - const res = await uniID.bindMobile({ + const res = await uniID.bindMobile({ uid: payload.uid, - mobile, + mobile, code }) return res } -``` - -## 解绑手机 +``` + +## 解绑手机 用法:`uniID.unbindMobile(Object mobileInfo)` @@ -651,26 +660,26 @@ exports.main = async function(event,context) { const uniID = require('uni-id') exports.main = async function(event,context) { const { - mobile, + mobile, code - } = event - const payload = await uniID.checkToken(event.uniIdToken) - if(payload.code > 0) { - return payload + } = event + const payload = await uniID.checkToken(event.uniIdToken) + if(payload.code > 0) { + return payload } - const res = await uniID.unbindMobile({ + const res = await uniID.unbindMobile({ uid: payload.uid, - mobile, + mobile, code }) return res } ``` - -## 邮箱验证码直接登录 - -用法:`uniID.loginByEmail(Object emailInfo)` + +## 邮箱验证码直接登录 + +用法:`uniID.loginByEmail(Object emailInfo)` **mobileInfo**参数说明 @@ -695,17 +704,17 @@ exports.main = async function(event,context) { const uniID = require('uni-id') exports.main = async function(event,context) { const { - email, + email, code } = event const res = await uniID.loginByEmail({ - email, + email, code }) return res } -``` +``` ## 绑定邮箱 @@ -733,23 +742,23 @@ exports.main = async function(event,context) { const uniID = require('uni-id') exports.main = async function(event,context) { const { - email, + email, code - } = event - const payload = await uniID.checkToken(event.uniIdToken) - if(payload.code > 0) { - return payload + } = event + const payload = await uniID.checkToken(event.uniIdToken) + if(payload.code > 0) { + return payload } - const res = await uniID.bindEmail({ + const res = await uniID.bindEmail({ uid: payload.uid, - email, + email, code }) return res } -``` +``` ## 解绑邮箱 @@ -777,16 +786,16 @@ exports.main = async function(event,context) { const uniID = require('uni-id') exports.main = async function(event,context) { const { - email, + email, code - } = event - const payload = await uniID.checkToken(event.uniIdToken) - if(payload.code > 0) { - return payload + } = event + const payload = await uniID.checkToken(event.uniIdToken) + if(payload.code > 0) { + return payload } - const res = await uniID.unbindEmail({ + const res = await uniID.unbindEmail({ uid: payload.uid, - email, + email, code }) return res @@ -824,17 +833,17 @@ exports.main = async function(event,context) { return res } -``` +``` ## 微信登录 用法:`uniID.loginByWeixin(String code);` **注意** - -- 需要在config.json内使用微信登录的平台下配置appid和appsecret + +- 需要在config.json内使用微信登录的平台下配置appid和appsecret - uniId会自动判断客户端平台 -- 登录成功之后应持久化存储token,键值为:uniIdToken,`uni.removeStorageSync('uniIdToken')` +- 登录成功之后应持久化存储token,键值为:uniIdToken,`uni.removeStorageSync('uniIdToken')` - App端获取code不可直接调用`uni.login`,详细用法可以看下面示例 **参数说明** @@ -861,9 +870,9 @@ exports.main = async function(event,context) { const res = await uniID.loginByWeixin(event.code) return res } - -// 客户端代码 -// 代码较长建议直接参考插件市场示例项目:https://ext.dcloud.net.cn/plugin?id=2116 + +// 客户端代码 +// 代码较长建议直接参考插件市场示例项目:https://ext.dcloud.net.cn/plugin?id=2116 let weixinAuthService export default { data() { @@ -931,16 +940,16 @@ export default { }) } } -} +} + +``` + +## 绑定微信 -``` - -## 绑定微信 - 用法:`uniID.bindWeixin(Object weixinInfo);` - -**weixinInfo 参数说明** - + +**weixinInfo 参数说明** + **参数说明** | 字段| 类型 | 必填| 说明 | @@ -953,28 +962,28 @@ export default { | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| msg | String| 是 |详细信息 | - +| msg | String| 是 |详细信息 | + ```js // 云函数代码 const uniID = require('uni-id') -exports.main = async function(event,context) { - payload = await uniID.checkToken(event.uniIdToken) - if (payload.code && payload.code > 0) { - return payload +exports.main = async function(event,context) { + payload = await uniID.checkToken(event.uniIdToken) + if (payload.code && payload.code > 0) { + return payload } - const res = await uniID.bindWeixin({ - uid: payload.uid, - code: event.code + const res = await uniID.bindWeixin({ + uid: payload.uid, + code: event.code }) return res -} -``` - -## 解绑微信 - +} +``` + +## 解绑微信 + 用法:`uniID.unbindWeixin(String uid);` - + **参数说明** | 字段| 类型 | 必填| 说明 | @@ -986,27 +995,27 @@ exports.main = async function(event,context) { | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| msg | String| 是 |详细信息 | - +| msg | String| 是 |详细信息 | + ```js // 云函数代码 const uniID = require('uni-id') -exports.main = async function(event,context) { - payload = await uniID.checkToken(event.uniIdToken) - if (payload.code && payload.code > 0) { - return payload +exports.main = async function(event,context) { + payload = await uniID.checkToken(event.uniIdToken) + if (payload.code && payload.code > 0) { + return payload } const res = await uniID.unbindWeixin(payload.uid) return res -} -``` +} +``` ## 支付宝登录 用法:`uniID.loginByAlipay(String code);` **注意** - + - 需要在config.json内支付宝平台下配置appid和privateKey(应用私钥) - 登录成功之后应持久化存储token,键值为:uniIdToken,`uni.removeStorageSync('uniIdToken')` @@ -1034,14 +1043,14 @@ exports.main = async function(event,context) { const res = await uniID.loginByAlipay(event.code) return res } -``` - -## 绑定支付宝 - +``` + +## 绑定支付宝 + 用法:`uniID.bindAlipay(Object alipayInfo);` - -**alipayInfo 参数说明** - + +**alipayInfo 参数说明** + **参数说明** | 字段| 类型 | 必填| 说明 | @@ -1054,28 +1063,28 @@ exports.main = async function(event,context) { | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| msg | String| 是 |详细信息 | - +| msg | String| 是 |详细信息 | + ```js // 云函数代码 const uniID = require('uni-id') -exports.main = async function(event,context) { - payload = await uniID.checkToken(event.uniIdToken) - if (payload.code && payload.code > 0) { - return payload +exports.main = async function(event,context) { + payload = await uniID.checkToken(event.uniIdToken) + if (payload.code && payload.code > 0) { + return payload } - const res = await uniID.bindAlipay({ - uid: payload.uid, - code: event.code + const res = await uniID.bindAlipay({ + uid: payload.uid, + code: event.code }) return res -} -``` - -## 解绑支付宝 - +} +``` + +## 解绑支付宝 + 用法:`uniID.unbindAlipay(String uid);` - + **参数说明** | 字段| 类型 | 必填| 说明 | @@ -1087,27 +1096,27 @@ exports.main = async function(event,context) { | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| msg | String| 是 |详细信息 | - +| msg | String| 是 |详细信息 | + ```js // 云函数代码 const uniID = require('uni-id') -exports.main = async function(event,context) { - payload = await uniID.checkToken(event.uniIdToken) - if (payload.code && payload.code > 0) { - return payload +exports.main = async function(event,context) { + payload = await uniID.checkToken(event.uniIdToken) + if (payload.code && payload.code > 0) { + return payload } const res = await uniID.unbindAlipay(payload.uid) return res -} -``` - -## 更新用户信息 - +} +``` + +## 更新用户信息 + 用法:`uniID.updateUser(Object userInfo);` - -此接口用于在其他接口不满足需求时使用 - + +此接口用于在其他接口不满足需求时使用 + **userInfo参数说明** | 字段| 类型 | 必填| 说明 | @@ -1120,68 +1129,68 @@ exports.main = async function(event,context) { | 字段| 类型 | 必填| 说明 | | --- | --- | --- | --- | | code| Number| 是 |错误码,0表示成功| -| msg | String| 是 |详细信息 | - +| msg | String| 是 |详细信息 | + ```js // 云函数代码 const uniID = require('uni-id') -exports.main = async function(event,context) { - payload = await uniID.checkToken(event.uniIdToken) - if (payload.code && payload.code > 0) { - return payload +exports.main = async function(event,context) { + payload = await uniID.checkToken(event.uniIdToken) + if (payload.code && payload.code > 0) { + return payload } - const res = await uniID.updateUser({ - uid: payload.uid, - nickname: 'user nickname' + const res = await uniID.updateUser({ + uid: payload.uid, + nickname: 'user nickname' }) return res -} -``` - -## 自行初始化uni-id - +} +``` + +## 自行初始化uni-id + 用法:`uniID.init(Object config);` - -此接口适用于不希望使用config.json初始化而是希望通过js的方式传入配置的情况 - + +此接口适用于不希望使用config.json初始化而是希望通过js的方式传入配置的情况 + **config参数说明** - + config格式与config.json完全相同 -**响应参数** +**响应参数** + +无 -无 - ```js // 云函数代码 -const uniID = require('uni-id') -uniID.init({ - "passwordSecret": "passwordSecret-demo", // 用于加密用户密码 - "tokenSecret": "tokenSecret-demo", // 用于生成token - "tokenExpiresIn": 7200, // token过期时间 - "passwordErrorLimit": 6, // 同一个ip密码错误最大重试次数 - "passwordErrorRetryTime": 3600, // 超过密码重试次数之后的等待时间 - "service": { - "sms": { - "name": "DCloud", // 应用名称对应uniCloud.sendSms的data参数内的name - "codeExpiresIn": 180, // 验证码过期时间,单位:秒,只可取60的整数倍,不填此参数时会取默认值180秒 - "smsKey": "your sms key", // 短信密钥key - "smsSecret": "your sms secret" // 短信密钥secret - } - } +const uniID = require('uni-id') +uniID.init({ + "passwordSecret": "passwordSecret-demo", // 用于加密用户密码 + "tokenSecret": "tokenSecret-demo", // 用于生成token + "tokenExpiresIn": 7200, // token过期时间 + "passwordErrorLimit": 6, // 同一个ip密码错误最大重试次数 + "passwordErrorRetryTime": 3600, // 超过密码重试次数之后的等待时间 + "service": { + "sms": { + "name": "DCloud", // 应用名称对应uniCloud.sendSms的data参数内的name + "codeExpiresIn": 180, // 验证码过期时间,单位:秒,只可取60的整数倍,不填此参数时会取默认值180秒 + "smsKey": "your sms key", // 短信密钥key + "smsSecret": "your sms secret" // 短信密钥secret + } + } }) -exports.main = async function(event,context) { - payload = await uniID.checkToken(event.uniIdToken) - if (payload.code && payload.code > 0) { - return payload +exports.main = async function(event,context) { + payload = await uniID.checkToken(event.uniIdToken) + if (payload.code && payload.code > 0) { + return payload } - const res = await uniID.updateUser({ - uid: payload.uid, - nickname: 'user nickname' + const res = await uniID.updateUser({ + uid: payload.uid, + nickname: 'user nickname' }) return res -} -``` +} +``` # 数据库结构 @@ -1211,13 +1220,13 @@ exports.main = async function(event,context) { | register_ip | String | 否 | 注册时 IP 地址 | | last_login_date | Timestamp | 否 | 最后登录时间 | | last_login_ip | String | 否 | 最后登录时 IP 地址 | - -**wx_openid字段定义** - -| 字段 | 类型 | 必填 | 描述 | -| ------- | ------ | ---- | -------- | -| app-plus | String | 否 | app平台微信openid | -| mp-weixin| String | 否 | 微信小程序平台openid | + +**wx_openid字段定义** + +| 字段 | 类型 | 必填 | 描述 | +| ------- | ------ | ---- | -------- | +| app-plus | String | 否 | app平台微信openid | +| mp-weixin| String | 否 | 微信小程序平台openid | **realNameAuth 扩展字段定义** 该字段存储实名认证信息。 @@ -1262,80 +1271,80 @@ exports.main = async function(event,context) { } ``` - -## 验证码表 - -表名:`uni-verify` - -| 字段 | 类型 | 必填 | 描述 | -| ---------- | --------- | ---- | -------------------------------------- | -| \_id | Object ID | 是 | 存储文档 ID(验证码 ID),系统自动生成 | -| mobile | String | 是 | 手机号,和邮箱二选一 | -| email | String | 是 | 邮箱,和手机号二选一 | -| code | String | 是 | 验证码 | -| type | String | 是 | 验证类型:login, bind, unbind, pay | -| state | Integer | 是 | 验证状态:0 未验证 1 已验证 2 已作废 | -| ip | String | 是 | 请求时 IP 地址 | -| created_at | Timestamp | 是 | 创建时间 | -| expired_at | Timestamp | 是 | 验证码过期时间 | - -# 错误码 - -自`1.1.0`版本使用此错误码规范 - -|模块 |模块码 |错误代码 |错误信息 | -|:-: |:-: |:-: |:-: | -|登录通用模块 |100 |01 |账号已禁用 | -|账号、邮箱、手机+密码登录 |101 |01 |用户不存在 | -| | |02 |密码错误 | -| | |03 |密码错误次数过多 | -|手机号验证码登录/注册 |102 |- |- | -|邮箱验证码登录/注册 |103 |- |- | -|微信登录/注册 |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 |验证码发送失败,一般msg内有描述 | -|绑定账号 |600 |- |- | -|绑定手机号 |601 |01 |此手机号已被绑定 | -|绑定邮箱 |602 |01 |此邮箱已被绑定 | -|绑定微信 |603 |01 |获取openid失败 | -| | |02 |此账号已被绑定 | -|绑定支付宝 |604 |01 |获取openid失败 | -| | |02 |此账号已被绑定 | -|解绑账号 |700 |- |- | -|解绑手机号 |701 |01 |解绑失败,可能已经解绑或者账号不匹配 | -|解绑邮箱 |702 |01 |解绑失败,可能已经解绑或者账号不匹配 | -|解绑微信 |703 |01 |解绑失败,可能已经解绑 | -|解绑支付宝 |704 |01 |解绑失败,可能已经解绑 | -|基础功能 |800 |- |- | -|更新用户信息 |801 |- |- | -|设置头像 |802 |- |- | -|公用码 |900 |01 |数据库读写异常 | - -# FAQ - -- token数组为什么越来越长 - + 每次登录成功都会新增一个token,并且检查所有token的有效期删除过期token。正常情况下客户端应该判断持久化存储的token是否还在有效期内,如果还有效就直接进入应用,不再执行登录。这样相当于用户的每个设备上都存在一个有效期内的token,云端也是。 - -- 复制token到其他环境校验不通过 - + uni-id内会校验客户端ua,如果是在本地调试可以在云函数内修改`context.CLIENTUA`为生成token的设备ua,切记上线删除此逻辑 - -- username、email、mobile三个字段 + +## 验证码表 + +表名:`uni-verify` + +| 字段 | 类型 | 必填 | 描述 | +| ---------- | --------- | ---- | -------------------------------------- | +| \_id | Object ID | 是 | 存储文档 ID(验证码 ID),系统自动生成 | +| mobile | String | 是 | 手机号,和邮箱二选一 | +| email | String | 是 | 邮箱,和手机号二选一 | +| code | String | 是 | 验证码 | +| type | String | 是 | 验证类型:login, bind, unbind, pay | +| state | Integer | 是 | 验证状态:0 未验证 1 已验证 2 已作废 | +| ip | String | 是 | 请求时 IP 地址 | +| created_at | Timestamp | 是 | 创建时间 | +| expired_at | Timestamp | 是 | 验证码过期时间 | + +# 错误码 + +自`1.1.0`版本使用此错误码规范 + +|模块 |模块码 |错误代码 |错误信息 | +|:-: |:-: |:-: |:-: | +|登录通用模块 |100 |01 |账号已禁用 | +|账号、邮箱、手机+密码登录 |101 |01 |用户不存在 | +| | |02 |密码错误 | +| | |03 |密码错误次数过多 | +|手机号验证码登录/注册 |102 |- |- | +|邮箱验证码登录/注册 |103 |- |- | +|微信登录/注册 |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 |验证码发送失败,一般msg内有描述 | +|绑定账号 |600 |- |- | +|绑定手机号 |601 |01 |此手机号已被绑定 | +|绑定邮箱 |602 |01 |此邮箱已被绑定 | +|绑定微信 |603 |01 |获取openid失败 | +| | |02 |此账号已被绑定 | +|绑定支付宝 |604 |01 |获取openid失败 | +| | |02 |此账号已被绑定 | +|解绑账号 |700 |- |- | +|解绑手机号 |701 |01 |解绑失败,可能已经解绑或者账号不匹配 | +|解绑邮箱 |702 |01 |解绑失败,可能已经解绑或者账号不匹配 | +|解绑微信 |703 |01 |解绑失败,可能已经解绑 | +|解绑支付宝 |704 |01 |解绑失败,可能已经解绑 | +|基础功能 |800 |- |- | +|更新用户信息 |801 |- |- | +|设置头像 |802 |- |- | +|公用码 |900 |01 |数据库读写异常 | + +# FAQ + +- token数组为什么越来越长 + + 每次登录成功都会新增一个token,并且检查所有token的有效期删除过期token。正常情况下客户端应该判断持久化存储的token是否还在有效期内,如果还有效就直接进入应用,不再执行登录。这样相当于用户的每个设备上都存在一个有效期内的token,云端也是。 + +- 复制token到其他环境校验不通过 + + uni-id内会校验客户端ua,如果是在本地调试可以在云函数内修改`context.CLIENTUA`为生成token的设备ua,切记上线删除此逻辑 + +- username、email、mobile三个字段 + 三个字段均可能为空,但是建议限制一下插入数据库三个字段的格式,比如username不应是邮箱格式或手机号格式,因为登录时可以选择使用username或mobile或email+密码的方式 \ No newline at end of file