之前使用UCENTER作为用户数据的管理后台,因为JAVA端的后台一直与之结合,新开发的外包项目也直接在此基础上开发。结果新的H5游戏在注册登陆这块因使用UC而踩了个坑,浪费了一天时间。我的业务是注册与登陆写了一个接口,无此用户直接算注册,有则直接算登陆。问题则发生成密码上,我前台输入的密码直接MD5后用作密码,在注册接口中,UCENTER是$password = md5(md5($password).$salt)。也就是前端给来的密码先进行了一次MD5后与用户动态字段进行合并 再一次MD5。 生成用于比对验证的最终记录密码。而在登陆时,UC的验证方法里对前端 传来的密码进行了一次判断。如果正好是32位的加密串,则直接用于验证,而我传来的正是直接加密过的MD5串,导致在注册时与验证时使用了不同的流程而无法通过验证。这个问题让我找了一天。。。只得阅读UCENTER的代码找问题才发现原因。记录下来,以免以后忘记。
下面就是 UCENTER里的登陆验证逻辑。
$passwordmd5 = preg_match('/^\w{32}$/', $password) ? $password : md5($password);
if(empty($user)) {
$status = -1;
} elseif($user['password'] != md5($passwordmd5.$user['salt'])) {
$status = -2;
}