l***@qq.com
l***@qq.com
  • 发布:2024-09-23 19:30
  • 更新:2024-09-23 19:30
  • 阅读:92

【经验分享】【微信小程序】简单在已有账号系统基础上引入uni-id使用clientDB的权限管理

分类:uniCloud

折腾了一下午,终于给我的小程序成功引入了uni-id,之前每次想到要迁移就头大,今天终于下定决心换到clientDB了,也是为了减少云函数的用量。在这里就简单分享一下校验。

参考:https://en.uniapp.dcloud.io/uniCloud/uni-id.html(这个教程是老的uni-id,对我够用了,不想迁移到新版)

安装uni-id

  1. 导入插件。
  2. 写config-center的配置,复制上面教程的文件只需要改mp-weixin.oauth.weixin内的appid和secret。
  3. 创建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 关注 分享

要回复文章请先登录注册