介绍
官方文档:https://uniapp.dcloud.io/uniCloud/uni-id
======================
1、创建 Uni-id
建议直接通过引入 uni-admin 的方式创建,这个是整合了 Uni-config-center 配置中心 + Uni-id 用户体系,组成的注册、修改信息、停用启用、删除、角色管理、权限管理的框架。
https://uniapp.dcloud.io/uniCloud/admin
直接在 HBuilderX 中创建 uniCloud admin 项目即可
创建后,直接自带一个官方编写好的 uni-id-cf 云函数,里面包含了登录、注册、获取验证码等等方法,通过调用这个云函数时传入一个属性action,来决定调用什么方法。
这种方式的好处,可以查看 https://www.yuque.com/yejielin/mypn47/pql48r#pbQHt,主要是云函数可以一直热启动,保持运行性能。
2、默认配置说明(重要)
位置
默认配置在云函数里面的公共模块,配置中心里面,uni-id 文件夹的config.json
配置说明:https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=config
注意事项(重要)
注意!json配置里面,不能有注释//,否则会报错!!!
修改配置
直接改上图里面的 config.json 文件即可。
里面的属性参考配置说明。
3、首次使用创建超级管理员
点下项目,点右上角的“浏览”,HBuilderX 会编译并打开内置的web浏览器
点击如下,即可创建超级管理员账号
同时云数据库 的id表,会多一个超级管理员账号
目前只有这个方法创建超级管理员,如果是直接往这个表添加记录可能会有点问题,比如这里的密码是根据配置里面的 passwordSecret 属性加密过的。
4、通用的云函数 uni-id-cf
说明
云函数下,如果是通过uni-admin 创建的,会自带一个官方写好的云函数 uni-id-cf
云函数的功能包含了注册、登录、获取验证码、修改用户信息等等。
你可以通过前端直接请求这个云函数,加上action属性设置不同的行为,就可以得到不同的结果。
函数运行全解析
5、云函数url化后的uni-id(重点)
如果你想把uni-admin整个项目作为后端,可以把云函数url化,然后用你的前端发送请求,去请求云函数的url即可。
但是有几点要注意!
注意1:需要配置APPID
配置中心里面,uni-id 文件夹的config.json,一定要写上appid,这个appid可以通过项目中的 manifest.json 查看得到,只要你在HBuilderX中登录了账号,项目关联了云空间,就一定会有appid
UNICloud做了应用级用户隔离,不同的appid是无法相互访问的,如果没有appid,上面创建的超级管理员账号,你的前端永远无法访问,一直提示用户不存在
因为不同的appid,系统当做不同的应用,无法相互访问
注意2:创建uni-id实例需要appid
由于云函数url化,你前端的请求uni-id无法正常获取云函数的context,因此要手动设置,如下:
context.PLATFORM = ‘h5’
context.APPID = uniIdConfig.service.univerify.appid
// cloudfunctions/uni-id-cf
// 上面省略了代码
// 云函数
exports.main = async (event, context) => {
// 设置平台
context.PLATFORM = 'h5'
// 设置APPID,云函数url化,一定要配置appid
context.APPID = uniIdConfig.service.univerify.appid
// 2、创建 uni-id 实例 ,后续使用 uni-id 调用相关接口
// UNI_WYQ:这里的uniID换成新的,保证多人访问不会冲突
uniID = uniID.createInstance({
context
})
// 下面省略了代码
理由同注意1
注意3:云函数event不一样
在uni项目中通过 uni.callfunction 调用云函数,传入的event参数,
和
云函数url化,你通过其他项目前端请求云函数,传入的event参数,
两个是完全不一样的。
uni.callfunction 的event:
event:{
action:"login",
params:{
username:"1231321",
password:"123123213213123",
captchaOptions:{"deviceId":"123213213","scene":"login"}
}
}
你前端请求的event:
{
path: 'HTTP请求路径,如 /hello',
httpMethod: 'HTTP请求方法,如 GET',
headers: {HTTP请求头},
queryStringParameters: {HTTP请求的Query,键值对形式},
body: 'POST方法的data属性,为JSON格式,要自己转一下',
isBase64Encoded: 'true or false,表示body是否为Base64编码'
}
因此你的云函数,获取前端请求的参数,需要如下处理一下,兼顾两种不同的event
// 3、获取前端请求过来的参数
/*
event为客户端 uniCloud.callFunction填写的data的值,这里介绍一下其中的属性
action:表示要执行的任务名称、比如:登陆login、退出登陆 logout等
params:业务数据内容
uniIdToken:系统自动传递的token,数据来源客户端的 uni.getStorageSync('uni_id_token')
*/
let requestBody = {}
if(event.body){
requestBody = JSON.parse(event.body)
}
let {
uniIdToken,
inviteCode,
} = event;
const deviceInfo = event.deviceInfo || {};
let action = event.action || requestBody.action;
let params = event.params || requestBody.params;