即使密码错误,WP_SignOn也始终传递密码

时间:2014-05-18 作者:Malloc

我正在测试通过PHP API登录用户,目前我对参数进行了硬编码:

    $creds = array();
        $creds[\'user_login\'] = \'foo\';
        $creds[\'user_password\'] = \'bar\';

    $user = wp_signon( $creds, false );
    if ( is_wp_error($user) )
        echo $user->get_error_message();
    else
        echo \'login successfull\';
问题是,它测试的是用户名的完整性,而不是密码,尽管我很确定密码是错误的,但登录是成功的,这意味着登录功能没有正常工作。我将wp配置文件包括在文件顶部,并在发布之前测试了wp DB连接:

require_once (\'../wp-config.php\');
我遗漏了什么吗?

更新时间:

我正在调试$user 变量:var_dump($user); 下面是我得到的:

    login successfull object(WP_User)#304 (7) { ["data"]=> object(stdClass)#305
 (10) { ["ID"]=> string(2) "75" ["user_login"]=> string(5) "foo" ["user_pass"]=> 
string(34) "$P$B5uc93mdbK3R8QDOa0uC/fDnUu8rkP1" ["user_nicename"]=> string(5) 
"foo" ["user_email"]=> string(23) "[email protected]" ["user_url"]=> string(0) ""
 ["user_registered"]=> string(19) "2014-05-15 17:52:45" ["user_activation_key"]=> 
string(0) "" ["user_status"]=> string(1) "0" ["display_name"]=> string(5) "foo" }
 ["ID"]=> int(75) ["caps"]=> array(1) { ["subscriber"]=> bool(true) } 
["cap_key"]=> string(15) "wp_capabilities" ["roles"]=> array(1) { [0]=> string(10)
 "subscriber" } ["allcaps"]=> array(3) { ["read"]=> bool(true) ["level_0"]=> 
bool(true) ["subscriber"]=> bool(true) } ["filter"]=> NULL }
每当我输入错误的用户名时,就会抛出一个非常明显的错误:

ERROR: Invalid username. Lost your password?ERROR: Invalid username. Lost your password?
尽管我确信密码输入错误,但它始终通过了测试。

1 个回复
SO网友:Otto

wp\\u signon函数可能正按照预期工作。您缺少的是其他身份验证方法,如浏览器cookie,wp\\u signon也会检查这些方法。您的浏览器是否正在向脚本发送WordPress验证cookie?

底线是,您不应该在这里使用wp\\u signon,或者实际上,在任何地方都不应该使用wp\\u signon。请参见,wp\\u signon函数执行整个身份验证堆栈,而不仅仅是简单的用户名和密码检查。人们可以通过提供用户名和密码以外的其他方式进行身份验证,wp\\u signon将对它们进行全部检查,包括插件添加的方法和任何其他挂钩到身份验证过滤器的方法。

wp\\u signon函数用于实际验证WordPress本身,而不是您的脚本。您使用了错误的函数。

如果只想检查用户名和密码,请使用wp_authenticate_username_password 功能。

基本上,从PHP脚本的角度来看,“登录用户”的整个概念实际上没有任何意义。您可以验证用户的凭据,然后只需执行以下操作wp_set_current_user 成为那个用户,但代码实际上可以是它想成为的任何用户。您可以调用wp\\u set\\u current\\u user“成为”任何用户,而无需任何凭据。自定义PHP脚本一开始就具有完全访问权限。

所以,真的,没必要打电话wp_signon 除非您希望a)进行身份验证,然后b)将身份验证cookie发送回用户浏览器。如果您没有主动与用户的浏览器对话,以通过cookie向WordPress验证该浏览器,那么您不需要这样做wp_signon, 曾经

如果您需要从其他地方验证用户的凭据,那么有许多功能可以做到这一点。您可以使用您喜欢的任何方式验证这些凭据,然后wp\\u set\\u current\\u user成为该特定会话的用户。如果您想让他们永久登录,也可以通过向他们发送身份验证cookie,但您可能希望更直接地登录,而不是通过wp\\u登录。即便如此,如果您正在这样做,那么一种简单得多的方法就是创建一个新的身份验证函数,根据您的检查返回一个有效的WP\\u用户,并将其挂接到authenticate过滤器。然后,用于身份验证的自定义代码变得更加简单。

所以,定义你在做什么。然后人们会给你最好的方法。最好的方法永远不会是亲自打电话给wp\\u signon,永远不会

结束

相关推荐

为什么我的定制函数不是从我的unctions.php文件开始的?

我们希望清理一些WordPress URL,并按照以下格式进行一些重写:实际URL:产品一/产品一指南/实际URL:产品二/产品二指南/重写URL:产品一/指南/重写URL:产品二/指南/这允许我们在不同的产品中使用相同的子文件夹名称。(无重复的slug问题)总之,我在函数中有一个函数。实现此功能的php:// URL replaces function updateToPerfectURLs($content) { $new_content = $content;&#x