在Discuz修改密码,Ucenter返回给第三方网站的密码为空

[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/120/ ]

具体的现象就是,用户在Discuz论坛修改密码,但是接入UCenter用户中心的第三方网站接收到的密码为空,用户名却能正常获取,这个问题很严重,导致了很多用户修改密码后,无法正常登录第三方网站了.

具体的现象就是,用户在Discuz论坛修改密码,但是接入UCenter用户中心的第三方网站接收到的密码为空,用户名却能正常获取,这个问题很严重,导致了很多用户修改密码后,无法正常登录第三方网站了。

为了快速解决问题,先百度了一下,但是没找到什么有帮助的线索,就立马把精力转向代码。由于是UCenter相关的功能出了问题,所以就把注意力集中在uc_client、uc_server这两块。很快,就发现control文件夹中的user.php控制器,其中的代码有点匪夷所思。打开Discuz根目录中的uc_client/control/user.php,搜索updatepw即可找到如下代码:

$_ENV['note']->add('updatepw', 'username='.urlencode($username).'&password=');
$_ENV['note']->send();

就是这段代码,把用户名通过UCenter用户中心传了出去,但是密码是空的。匪夷所思的是,第三方网站也是以这种方式传递用户名跟密码的,然而discuz却能正常修改密码。如果有人清楚其中的奥妙,还请多多指教,为了赶时间修复问题,就先把疑问放一边了

把上边的代码改一下:

$_ENV['note']->add('updatepw', 'username='.urlencode($username).'&password='.$newpw);
$_ENV['note']->send();

这样就能把密码通过UCenter用户中心发送给第三方网站了。

    评论:

    1. 394911284@qq.com 回复2015年03月26日 11时28分
      磨者
      discuz在api/uc.php里面同步接收改密码通知的代码也是匪夷所思
      
      搜索function updatepw($get, $post)
      
      会发现这个$newpw = md5(time().rand(100000, 999999));
      
      完全是随机生成嘛

        root @394911284@qq.com 回复2015年05月21日 12时32分
        磨者
        嗯,你是对的
        使用了一段时间,发现只要启用UC用户中心,DISCUZ的per_common_member表保存的密码就没意义了
        验证的时候直接走的是UC的验证机制,用户密码保存在了uc_members表中
        在没有文档说明的情况下,确实会让人匪夷所思。

    2. 394911284@qq.com 回复2015年03月26日 15时06分
      磨者
      咱来补充一个好了
      
      管理员登录Ucenter后台之后(从uc_server/admin.php),修改用户密码之后,Ucenter返回给第三方网站的密码同样为空。。
      
      解决办法:
      
      打开uc_server\control\admin\user.php搜索updatepw即可找到如下代码:
      
      $_ENV['note']->add('updatepw', 'username='.urlencode($username).'&password=');
      
      改成这样就好啦:
      
      $_ENV['note']->add('updatepw', 'username='.urlencode($username).'&password='.$orgpassword);

    3. 我来说两句:

        切换  

      磨途歌检测发现,您当前使用的浏览器版本过低,要想使用画板模式,请先更新浏览器

        切换  

      磨途歌随机验证码