The application_password_did_authenticate action fires after an application password was used for authentication. It’s useful for running custom code when a user is authenticated using an application password.
Usage
add_action('application_password_did_authenticate', 'my_custom_function', 10, 2);
function my_custom_function($user, $item) {
    // your custom code here
}
Parameters
- $user: (WP_User) The user who was authenticated.
- $item: (array) The application password used.
More information
See WordPress Developer Resources: application_password_did_authenticate
Examples
Log successful authentication
Log every successful authentication using an application password.
add_action('application_password_did_authenticate', 'log_successful_authentication', 10, 2);
function log_successful_authentication($user, $item) {
    // Log successful authentication
    error_log("User {$user->user_login} authenticated with application password {$item['name']}.");
}
Notify user on authentication
Send an email to the user when they are authenticated using an application password.
add_action('application_password_did_authenticate', 'notify_user_on_authentication', 10, 2);
function notify_user_on_authentication($user, $item) {
    // Send an email to the user
    wp_mail($user->user_email, 'Successful Authentication', 'You were successfully authenticated using an application password.');
}
Restrict authentication by application password name
Disallow authentication for application passwords with a specific name.
add_action('application_password_did_authenticate', 'restrict_authentication_by_name', 10, 2);
function restrict_authentication_by_name($user, $item) {
    // Check if the application password name is "Restricted"
    if ($item['name'] == 'Restricted') {
        // Log out the user
        wp_logout();
        wp_die('Restricted application password used. Access denied.');
    }
}
Track last authentication time
Update a user meta field with the timestamp of the last successful authentication.
add_action('application_password_did_authenticate', 'track_last_authentication_time', 10, 2);
function track_last_authentication_time($user, $item) {
    // Update user meta with current timestamp
    update_user_meta($user->ID, 'last_authentication_time', time());
}
Limit authentication attempts
Limit the number of successful authentication attempts using application passwords within a specific time frame.
add_action('application_password_did_authenticate', 'limit_authentication_attempts', 10, 2);
function limit_authentication_attempts($user, $item) {
    $allowed_attempts = 5;
    $time_frame = 3600; // 1 hour in seconds
    // Get the current number of attempts
    $attempts = (int) get_user_meta($user->ID, 'authentication_attempts', true);
    // Check if the limit has been reached
    if ($attempts >= $allowed_attempts) {
        // Log out the user
        wp_logout();
        wp_die('Too many authentication attempts. Access denied.');
    } else {
        // Increment the attempts count and save it
        update_user_meta($user->ID, 'authentication_attempts', $attempts + 1);
        // Schedule the reset of the attempts count
        wp_schedule_single_event(time() + $time_frame, 'reset_authentication_attempts', array($user->ID));
    }
}
// Reset the authentication attempts count
add_action('reset_authentication_attempts', 'reset_attempts_count');
function reset_attempts_count($user_id) {
// Reset the attempts count
update_user_meta($user_id, 'authentication_attempts', 0);
}
Remember to clear scheduled events when the plugin is deactivated.
register_deactivation_hook(__FILE__, 'clear_scheduled_reset_events');
function clear_scheduled_reset_events() {
    // Get all users
    $users = get_users();
    // Loop through users and unschedule the reset events
    foreach ($users as $user) {
        wp_clear_scheduled_hook('reset_authentication_attempts', array($user->ID));
    }
}