折腾了一下午,终于给我的小程序成功引入了uni-id,之前每次想到要迁移就头大,今天终于下定决心换到clientDB了,也是为了减少云函数的用量。在这里就简单分享一下校验。
参考:https://en.uniapp.dcloud.io/uniCloud/uni-id.html(这个教程是老的uni-id,对我够用了,不想迁移到新版)
安装uni-id
- 导入插件。
- 写config-center的配置,复制上面教程的文件只需要改mp-weixin.oauth.weixin内的appid和secret。
- 创建uni-id-users和opendb-verify-codes表,后者用于验证码对小程序其实不必要,但我不知道删了能不能跑。
以上几步可以简单的安装好uni-id,然后便是迁移工作了。
迁移
首先我希望我的权限是依赖于openid的,所以我便利了我自己搭建的账号数据库,并逐条写入uni-id-user表,只需要写两个字段_id和wx_openid.mp-weixin,这两个字段同时设置为原先的openid。
登录
之后按照文档的微信登录段,新建一个云函数,内容如下
const uniID = require("uni-id");
exports.main = async function (event, context) {
// const res = await uniID.loginByWeixin(event.code)
const res = await uniID.loginByWeixin({
code: event.code,
});
return res;
};
注意这个云函数要选择公共依赖uni-id,安装的uni-id也需要选择公共依赖uni-open-bridge-common(我不知道为什么默认没选)。
以上是官方文档的,我将其修改为了
'use strict';
const uniID = require('uni-id');
const db = uniCloud.database();
const dbUID = db.collection('uni-id-users');
exports.main = async function (event) {
const res = await uniID.loginByWeixin({ code: event.code });
if (res.uid !== res.openid) {
await dbUID.doc(res.openid).set((await dbUID.doc(res.uid).field({ _id: false }).get()).data[0]);
await dbUID.doc(res.uid).remove();
res.uid = res.openid;
res.tokenExpired = 0;
}
return res;
};
因为默认第一次登录的账户他会新建一条记录,而这条记录的uid不是原有的openid,所以需要手动修改。
同时修改以后原先的token是作废的,所以使用tokenExpired=0来让客户端手动重新二次调用。(每次都需要上传一个只能用一次的code)
然后我客户端用这个云函数取代了我原先用于获取openid的云函数,因为这个也会返回openid,正好还能登录一举两得。
角色
另一方面为了用上uni-id的角色系统,我还在我自己的关于权限变更的云函数里同时变更uni-id-users表的role字段,这样clientDB也可以用角色控制了xd
0 个评论
要回复文章请先登录或注册