天策科技中心
天策科技中心
  • 发布:2022-06-14 18:32
  • 更新:2022-06-16 11:06
  • 阅读:93

uni-id设计存在缺陷

分类:uniCloud

两个项目绑定同一个云空间,在第一个上面注册账号,再绑定手机号码,然后在第二个项目使用手机号码登录.为什么不是登录该账号,而是变成了新创建一个账号?

2022-06-14 18:32 负责人:DCloud_UNI_WYQ 分享
已邀请:
天策科技中心

天策科技中心 (作者)

我看了文档,需要修改dcloud_appid字段,但是每次登录,就需要给该用户添加dcloud_appid不是很麻烦吗?如果我后面的项目继续添加,不是要不断地修改dcloud_appid?

天策科技中心

天策科技中心 (作者)

另外一种情况,项目不小心重置了,导致appid改变,又忘记给用户添加dcloud_appid,这样岂不是导致老用户全部变成新用户注册?

天策科技中心

天策科技中心 (作者)

内置方法添加多一个参数,是否需要根据appid进行隔离,应该不是难事吧,做到因人而异

天策科技中心

天策科技中心 (作者)

我经常遇到过特别是升级框架,没有对比仔细就被重置appid了,或者编译器发疯,无法上传云函数,非要我重置appid

呆狗的一生

呆狗的一生 - 呆狗的一生

A、B系统共用一个服务空间,在A系统中注册了,在B系统中,算是新用户。因为两个appid不相同,是两个不同的应用。你这个图上面,两个appid分别是__UNI__FB90BB3__UNI__A3A3BD9。另一个问题,不小心重置了appid的话,你可以查看数据库,把原来的值填写回去就行了。至于译器发疯的问题,我也没办法了

  • 天策科技中心 (作者)

    所以就不能使用同一个服务空间吗,以前都可以的,现在都倒退了

    2022-06-14 23:38

天策科技中心

天策科技中心 (作者)

还有就是,后来注册的用户,注册的dcoud_appid也是只有一个,想在另外一段打通,还需要注册的时候重新给他赋值?官方有没有考虑3端以上的情况?只考虑一端吗?

天策科技中心

天策科技中心 (作者)

即使每个删除dcloud_appid,只是允许之前已经注册过的用户登录任何端吧,但是即使之前的用户已经绑定了手机,通过手机号登录,还是会创建一个新的用户吧

  • DCloud_UNI_WYQ

    如果允许一个用户登录多端应该使用授权登录接口,uni-id是以用户为维度的,手机号并非对应唯一用户。你可以详细描述下你的业务吗?

    2022-06-15 16:00

  • 天策科技中心 (作者)

    回复 DCloud_UNI_WYQ:我有多个项目,都是绑定在同一个服务空间,用户可以使用各种登录方式,

    期望:他在某一个项目创建了账号,并绑定了手机号码,在另外一个项目使用手机号码登录的时候,应该是登录而不是注册新账号

    实际:新用户在某一个端注册之后,默认赋值dcloud_appid为该项目的,并没有其他项目的,所以想打通所有项目的话,还需要每次注册之后重新赋值所有的dcloud_appid给该用户,才能让用户在各端登录,而且在后续业务扩展的时候,添加了新的项目,需要重新给所有用户添加新的dcloud_appid,遇到忘记添加新的dcloud_appid或者项目出了意外被重置新的dcloud_appid,会导致所有的老客户登录的时候变成新用户.这不合理

    建议:目前我添加了一些逻辑,但是太繁琐,还需要特别小心.建议登录的时候可以传一个参数,不进行多端隔离,这点在底层应该容易实现吧

    2022-06-15 18:00

  • DCloud_UNI_WYQ

    回复 天策科技中心: 那你可以沿用旧uni-id逻辑,直接删除dcloud_appid字段,uni-id认为没有dcloud_appid字段的用户是可以在任一端登录的

    2022-06-15 19:51

  • 天策科技中心 (作者)

    回复 DCloud_UNI_WYQ: 删除dcloud_appid字段只对老用户可以登录任何端有效吧,但是有没有考虑新端,之前绑定手机号的用户,使用手机号登录的时候,还是会产生一个新的用户,并绑定新的dcloud_appid

    2022-06-15 22:55

  • DCloud_UNI_WYQ

    回复 天策科技中心: 你的意思是存在一个无dcloud_appid的账户时还会创建一个新账户?只要是没有dcloud_appid字段的都认为是可以全端登录的。以短信验证码登录/注册为例,如果用户表存在一个使用手机号18812345678的用户且这个用户没有dcloud_appid字段,那么无论他在哪端用短信验证码都是登录行为而不是注册。

    2022-06-16 11:03

  • DCloud_UNI_WYQ

    回复 天策科技中心: 下面贴了段代码你可以运行一下看看

    2022-06-16 11:07

  • 天策科技中心 (作者)

    回复 DCloud_UNI_WYQ:下面代码可行,对于不断添加项目的来说,删除dcoud_appid字段应该是最好的方法了,应该不会影响以后的升级吧

    2022-06-16 15:33

  • DCloud_UNI_WYQ

    回复 天策科技中心: 以后升级也会保留这个逻辑

    2022-06-16 20:50

DCloud_UNI_WYQ

DCloud_UNI_WYQ

'use strict';  
const uniID = require('uni-id')  
const db = uniCloud.database()  
exports.main = async (event, context) => {  
    const uniIDIns1 = uniID.createInstance({  
        context: {  
            APPID: "__UNI_123",  
            PLATFORM: "app-plus",  
            LOCALE: "zh-Hans",  
            CLIENTIP: '127.0.0.1'  
        }  
    })  
    await uniIDIns1.setVerifyCode({  
        mobile: '18812345678',  
        code: '123456',  
        expiresIn: 180,  
        type: 'login'  
    })  
    const {  
        uid: uid1  
    } = await uniIDIns1.loginBySms({  
        mobile: '18812345678',  
        code: '123456'  
    })  
    console.log(uid1);  
    await db.collection('uni-id-users').doc(uid1).update({  
        dcloud_appid: db.command.remove()  
    })  

    const uniIDIns2 = uniID.createInstance({  
        context: {  
            APPID: "__UNI_456",  
            PLATFORM: "mp-weixin",  
            LOCALE: "zh-Hans",  
            CLIENTIP: '127.0.0.1'  
        }  
    })  
    await uniIDIns2.setVerifyCode({  
        mobile: '18812345678',  
        code: '666666',  
        expiresIn: 180,  
        type: 'login'  
    })  
    const {  
        uid: uid2  
    } = await uniIDIns2.loginBySms({  
        mobile: '18812345678',  
        code: '666666'  
    })  
    console.log(uid2);  

    //返回数据给客户端  
    return {  
        uid1,  
        uid2  
    }  
};  

要回复问题请先登录注册