Support » Developing with WordPress » Creating an ‘authenticate’ filter

Viewing 9 replies - 1 through 9 (of 9 total)
  • That is a pluggable function, so if the core function is being run, your filter should be working. Since it’s not, perhaps a plugin has replaced the wp_authenticate function?

    Moderator bcworkz

    (@bcworkz)

    A plugin doesn’t even have to replace the function though it’s quite possible. It could improperly implement the same “authenticate” filter. Try adding your filter with a larger priority arg so it has the final say in the filter’s eventual return value. If that doesn’t help, the function was likely replaced.

    • This reply was modified 9 months, 3 weeks ago by bcworkz.
    Thread Starter joho68

    (@joho68)

    Thanks for the replies. This is getting weird.

    I have scanned the entire plugin directory for wp_authenticate and authenticate. Only one plugin does anything with it (it adds an action for ‘wp_authenticate’), but I have disabled that plugin.

    In my add_filter(), if I set anything higher than 19 as the priority, my code isn’t called at all.

    Maybe I’m going about this the wrong way (it’s not always easy to find the correct place of “insertion” in the WordPress chain of things), but I want to be able to inspect the login credentials and possibly abort with an error (and return to the login screen). The ‘authenticate’ filter seemed like a good place to do that.

    Thread Starter joho68

    (@joho68)

    Another thing I don’t understand is that the ‘authenticate’ filter seems to be called when I log out as well, with no username and no password. This is easy enough to ignore of course, but I don’t see the point of calling it at that time 🙂

    Thread Starter joho68

    (@joho68)

    So I’ve validated that my filter function is being called if I use a priority of 19 or lower, but it doesn’t seem to matter what I return, the login still proceeds (provided the given credentials are correct of course).

    Looking at the code here: https://developer.wordpress.org/reference/functions/wp_authenticate/, I cannot for the life of me figure out why my function returning an instance of WP_Error does not prevent the login.

    Thread Starter joho68

    (@joho68)

    OK. So this is weird, and I don’t know why, but if I set the priority to 99999, it works. I guess that means my function is called when everything is set-up, and that it was being called too soon previously.

    Once again, thanks for the replies.

    If you look in wp-includes/default-filters.php you’ll see

    add_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
    add_filter( 'authenticate', 'wp_authenticate_email_password', 20, 3 );
    add_filter( 'authenticate', 'wp_authenticate_application_password', 20, 3 );
    add_filter( 'authenticate', 'wp_authenticate_spam_check', 99 );

    and in wp-includes/user.php there is
    add_filter( 'authenticate', 'wp_authenticate_cookie', 30, 3 );

    so I wonder if those filters are even checking the incoming value, or are checking the original variables passed as context.

    Moderator bcworkz

    (@bcworkz)

    The problem appears to be with wp_authenticate_username_password(). It does check the incoming value, but I think it then overwrites it before acting upon it, so the check is ignored. Unconfirmed though, more investigation is needed.

    It’s only an issue (on my test site at least) if my authenticate callback is added with a priority < 20. If > 20, it works as expected.

    If I do remove_filter('authenticate','wp_authenticate_username_password', 20 ); my callback works regardless of the priority used. I don’t recommend removal like this, it’s just confirming that it’s the cause of the problem. Larger priority is the best solution.

    I created a ticket for this case.
    https://core.trac.wordpress.org/ticket/52439

Viewing 9 replies - 1 through 9 (of 9 total)
  • The topic ‘Creating an ‘authenticate’ filter’ is closed to new replies.