diff --git a/docs/uniCloud/uni-id-pages.md b/docs/uniCloud/uni-id-pages.md index 0c9647fb57a3e5a1fef92346eb743a7a1ee6e8bb..77cee9785650f6d7904df6fd1ad3f9cb082efec6 100644 --- a/docs/uniCloud/uni-id-pages.md +++ b/docs/uniCloud/uni-id-pages.md @@ -331,6 +331,7 @@ const uniIdCo = uniCloud.importObject('uni-id-co') |uniIdCo.getInvitedUser() |获取受邀用户 [详情](#get-invited-user) | |uniIdCo.setPushCid() |更新device表的push_clien_id [详情](#set-push-cid) | |uniIdCo.getSupportedLoginType()|获取支持的登录方式 [详情](#get-supported-login-type) | +|uniIdCo.getH5WeixinConfig()|获取微信公众号初始化配置 [详情](#get-h5-weixin-config) | ### 注册登录和登出@register-login-logout @@ -530,6 +531,38 @@ await uniIdCo.loginByWeixin({ | |- token |string |token | | |- tokenExpired|string |token过期时间 | +**注意** + +- 支持的登录方式:微信小程序、微信公众号、微信App、微信PC扫码 +- 微信登录会自动保存用户的openid,在`uni-id-pages 1.0.8`及更高版本在存储openid时会同时存储一份以当前应用的Appid(manifest.json内的DCloud AppId)为key的openid,见下方关于openid的说明。 +- 如果有多个应用同时使用微信小程序登录,且希望用户身份不隔离请确保这些应用在微信小程序平台为同一主体所有,即保证不同应用可以获取同样的unionid +- `uni-id-pages 1.0.8`及以上版本会使用uni-open-bridge-common保存session_key(微信小程序登录)、access_token(微信公众号登录、微信App登录)这些信息,但是为了兼容旧版逻辑仍在用户表存储了一份副本。详细说明参考:[自动保存用户sessionKey、accessToken等信息](uni-id-summary.md#save-user-token) + +**关于openid的说明** + +`uni-id-pages 1.0.7`及之前的版本会将微信的openid以以下形式存储 + +```js +{ + "_id": "xx", + "wx_openid": { + "mp": "weixin-openid-demo" + } +} +``` + +可以看到如果存在多个微信小程序关联同一个账号,这时候只能存储一个小程序的openid,在`uni-id-pages 1.0.8`版本对此进行了调整以Appid`__UNI_123456`为例,openid会在数据库内存储为以下形式 + +```js +{ + "_id": "xx", + "wx_openid": { + "mp": "weixin-openid-demo", + "mp___UNI_123456": "weixin-openid-demo", + } +} +``` + #### QQ登录@login-by-qq QQ账号已存在时登录,否则注册 @@ -563,6 +596,38 @@ await uniIdCo.loginByQQ({ | |- token |string |token | | |- tokenExpired|string |token过期时间 | +**注意** + +- 支持的登录方式:QQ小程序、QQ App +- QQ登录会自动保存用户的openid,在`uni-id-pages 1.0.8`及更高版本在存储openid时会同时存储一份以当前应用的Appid(manifest.json内的DCloud AppId)为key的openid,见下方关于openid的说明。 +- 如果有多个应用同时使用QQ小程序登录,且希望用户身份不隔离请确保这些应用在QQ小程序平台为同一主体所有,即保证不同应用可以获取同样的unionid +- `uni-id-pages 1.0.8`及以上版本会使用uni-open-bridge-common保存session_key(QQ小程序登录)、access_token(QQ App登录)这些信息,但是为了兼容旧版逻辑仍在用户表存储了一份副本。详细说明参考:[自动保存用户sessionKey、accessToken等信息](uni-id-summary.md#save-user-token) + +**关于openid的说明** + +`uni-id-pages 1.0.7`及之前的版本会将QQ的openid以以下形式存储 + +```js +{ + "_id": "xx", + "qq_openid": { + "mp": "weixin-openid-demo" + } +} +``` + +可以看到如果存在多个QQ小程序关联同一个账号,这时候只能存储一个小程序的openid,在`uni-id-pages 1.0.8`版本对此进行了调整以Appid`__UNI_123456`为例,openid会在数据库内存储为以下形式 + +```js +{ + "_id": "xx", + "qq_openid": { + "mp": "weixin-openid-demo", + "mp___UNI_123456": "weixin-openid-demo", + } +} +``` + #### 支付宝登录@login-by-alipay 支付宝账号已存在时登录,否则注册 @@ -771,7 +836,7 @@ await uniIdCo.bindMobileByUniverify({ #### 通过微信绑定手机号@bind-mobile-by-mp-weixin -使用此接口时务必注意,微信小程序的规则是客户端应先使用checkSession接口检测上次获取的sessionKey是否仍有效。如果有效则直接使用上次存储的sessionKey即可,如果无效应重新调用login接口再次刷新sessionKey。微信小程序登录,绑定小程序微信账号时会自动更新用户表的sessionKey。 +使用此接口时务必注意,微信小程序的规则是客户端应先使用checkSession接口检测上次获取的sessionKey是否仍有效。如果有效则直接使用上次存储的sessionKey即可,如果无效应重新调用login接口再次刷新sessionKey。微信小程序登录、绑定小程序微信账号时会自动更新用户的sessionKey。 **接口形式** @@ -1213,6 +1278,37 @@ await uniIdCo.setPushCid({ | |- token |string |token | | |- tokenExpired|string |token过期时间 | +#### 获取微信公众号初始化配置@get-h5-weixin-config + +**接口形式** + +```js +await uniIdCo.getH5WeixinConfig({ + url +}) +``` + +**参数说明** + +|参数名 |类型 |必填 |说明 | +|-- |-- |-- |-- | +|url |string |是 |当前客户端页面url,不带hash部分| + +**返回值** + +|参数名 |类型 |说明 | +|-- |-- |-- | +|errCode |string|number |错误码 | +|errMsg |string |错误信息 | +|appId |string |微信公众号appId| +|timestamp|number |时间戳 | +|nonceStr |string |随机串 | +|signature|string |签名 | + +客户端收到此接口响应后可以调用wx.config接口注入配置信息,详情参考:[微信公众号:通过 config 接口注入权限验证配置](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#4) + +**使用此接口前需要使用`uni-open-bridge`函数定时获取微信公众号的`access_token`及`ticket`,参考:[uni-open-bridge](uni-open-bridge.md)** + ### 管理接口@admin #### 管理员新增用户@add-user @@ -1432,7 +1528,6 @@ module.exports = { - 教程参考[短信服务开通指南](https://ask.dcloud.net.cn/article/37534) - 密钥配置:`uni-id配置文件` --> `service` --> `sms` 填写相关密钥信息。 - # 从老版uni-id公共模块升级到uni-id-pages 在HBuilderX 3.5之前,DCloud提供了一个公共模块[uni-id](https://ext.dcloud.net.cn/plugin?id=2116)(注意别和uni-id-common混淆)和一个示例性云函数uni-id-cf(集成在uni-starter和uni-admin中)。 diff --git a/docs/uniCloud/uni-id-summary.md b/docs/uniCloud/uni-id-summary.md index 1b3134caf5dfe6a39b32c4e362a6750101db09f5..697a0e9deba989c123065dc4a9a35246e75feefc 100644 --- a/docs/uniCloud/uni-id-summary.md +++ b/docs/uniCloud/uni-id-summary.md @@ -194,6 +194,7 @@ uni-id的云端配置文件在`uniCloud/cloudfunctions/common/uni-config-center/ // 如果拷贝此内容切记去除注释 { "passwordSecret": "passwordSecret-demo", // 数据库中password字段是加密存储的,这里的passwordSecret即为加密密码所用的密钥,注意修改为自己的密钥,使用一个较长的字符串即可 + "passwordStrength": "strong", // 密码强度,新增于 uni-id-pages 1.0.8版本,见下方说明 "tokenSecret": "tokenSecret-demo", // 生成token所用的密钥,注意修改为自己的,使用一个较长的字符串即可 "tokenExpiresIn": 7200, // 全平台token过期时间,未指定过期时间的平台会使用此值 "tokenExpiresThreshold": 600, // 新增于uni-id 1.1.7版本,checkToken时如果token有效期小于此值且在有效期内则自动获取新token,请注意将新token返回给前端保存(云对象会自动保存符合uniCloud响应体规范的响应内的新token),如果不配置此参数则不开启自动获取新token功能 @@ -220,7 +221,17 @@ uni-id的云端配置文件在`uniCloud/cloudfunctions/common/uni-config-center/ } }, "web": { // 如果你使用旧版本uni-id公共模块而不是uni-id-common这里可能配置的是h5,务必注意调整为web - "tokenExpiresIn": 14400, + "tokenExpiresIn": 259200, + "oauth": { + "weixin-h5": { // 微信公众号登录配置 + "appid": "weixin appid", + "appsecret": "weixin appsecret" + }, + "weixin-web": { // 微信PC页面扫码登录配置 + "appid": "weixin appid", + "appsecret": "weixin appsecret" + } + } }, "mp-weixin": { "tokenExpiresIn": 259200, @@ -275,7 +286,7 @@ uni-id的云端配置文件在`uniCloud/cloudfunctions/common/uni-config-center/ } ``` -**关于token自动刷新** +### token自动刷新@auto-refresh-token tokenExpiresThreshold用于指定token还有多长时间过期时自动刷新token。 @@ -283,6 +294,27 @@ tokenExpiresThreshold用于指定token还有多长时间过期时自动刷新tok 在token还有5分钟过期时调用checkToken接口会返回新的token和新的token的过期时间(新token有效时间也是2小时)。 +### 密码强度@password-strength + +> 新增于uni-id-pages 1.0.8 + +支持以下四种内置规则 + +```js +{ + // 密码必须包含大小写字母、数字和特殊符号 + super: /^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/])[0-9a-zA-Z~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]{8,16}$/, + // 密码必须包含字母、数字和特殊符号 + strong: /^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/])[0-9a-zA-Z~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]{8,16}$/, + // 密码必须为字母、数字和特殊符号任意两种的组合 + medium: /^(?![0-9]+$)(?![a-zA-Z]+$)(?![~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]+$)[0-9a-zA-Z~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]{8,16}$/, + // 密码必须包含字母和数字 + weak: /^(?=.*[0-9])(?=.*[a-zA-Z])[0-9a-zA-Z~!@#$%^&*_\-+=`|\\(){}[\]:;"'<>,.?/]{6,16}$/ +} +``` + +uni-id-co 与 uni-id-pages 内的前端页面均支持这四个内置规则,如需自定义规则,请参考:[uni-id-co自定义校验规则](uni-id-pages.md#custom-validator) + ## token令牌 首先解释下token的概念。token是服务器颁发给客户端的一个令牌。 @@ -1113,3 +1145,83 @@ module.exports = { ``` uni-id会自动进行语言匹配,无需额外配置 + +### 自动保存用户sessionKey、accessToken等信息@save-user-token + +uni-id-co在微信、QQ登录或注册时会自动保存用户的sessionKey、accessToken信息。 + +在`uni-id-pages 1.0.8`之前,uni-id-co直接将这些信息保存在了用户表(uni-id-users)的third_party字段下,仅按照平台区分没有按照不同应用区分。具体结构如下 + +```js +{ + "_id": "uid", + "wx_unionid": "xxx", + "qq_unionid": "xxx", + "third_party": { + "mp_weixin": { + "session_key": "xxxx" + }, + "app_weixin": { + "access_token": "accessToken", + "access_token_expired": 1111 + }, + "mp_qq": { + "session_key": "xxxx" + }, + "app_qq": { + "access_token": "accessToken", + "access_token_expired": 1111 + } + } +} +``` + +此结构无法满足多应用同一平台关联同一服务空间且允许用户跨应用登录的场景。因此在`uni-id-pages 1.0.8`及更高版本对此做出了调整,改为使用[uni-open-bridge-common](uni-open-bridge.md#uni-open-bridge-common)存储用户token信息。同时为了兼容旧版本上述third_party字段仍存有这些信息。 + +### 钩子@hooks + +> 新增于 uni-id-pages 1.0.8 + +uni-id-co是一个完整的云对象,里面注册登录等流程都已完全实现,开发者不方便进行修改。例如要实现注册时为某端用户统一添加一个角色的功能,只能去修改uni-id-co的代码。因此uni-id-co提供了通过钩子干涉内置逻辑的功能 + +uni-id钩子函数需要在uni-config-center内配置。在`uni-config-center/uni-id`下创建hooks目录并在其内创建`index.js`内容如下 + +```js +module.exports = { + beforeRegister: function (){ + // 注册前钩子 + } +} +``` + +#### beforeRegister@before-register + +beforeRegister在注册用户记录入库前触发。钩子会接收到如下参数,需要返回处理后的用户记录用以入库存储 + +|参数名 |类型 |说明 | +|-- |-- |-- | +|userRecord |Object |即将入库的用户记录 | +|clientInfo |Object |客户端信息,参考:[云对象 getClientInfo](cloud-obj.md#get-client-info) | + +以为__UNI_123123这个应用注册的用户添加"teacher"角色为例,beforeRegister钩子示例如下 + +```js +// 钩子函数示例 hooks/index.js + +function beforeRegister({ + userRecord, + clientInfo +} = {}) { + if(clientInfo.appId === '__UNI_123123') { + if(userRecord.role) { + userRecord.role.push('teacher') + } else { + userRecord.role = ['teacher'] + } + } +} + +module.exports = { + beforeRegister +} +``` \ No newline at end of file