Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wordpress User Authentication Process

Tags:

php

wordpress

I'm building a wordpress system where I want to authenticate users from external source instead of wordpress DB. I'm using wsdl service to communicate with the external DB and I'm getting the proper user information based on their credentials. However I'm not getting how to proceed with the obtained result further. Somebody please help me.

Following are steps I've done so far

Created custom function in pluggable.php and calling it in user.php

function wp_authenticate_username_password($user, $username, $password) {
    if ( is_a($user, 'WP_User') ) { return $user; }
    if ( empty($username) || empty($password) ) {
        if ( is_wp_error( $user ) )
            return $user;

        $error = new WP_Error();

        if ( empty($username) )
            $error->add('empty_username', __('<strong>ERROR</strong>: The username field is empty.'));

        if ( empty($password) )
            $error->add('empty_password', __('<strong>ERROR</strong>: The password field is empty.'));

        return $error;
    }

    //$user = get_user_by('login', $username);  /*Replaced it with the below*/

    $user = validate_ep($username,$password);    

    echo "<pre>";
    print_r($user);  /*Produces the result in step 3*/
    echo "</pre>";
    exit;

Custom Function in pluggable.php that communicates with my external DB

function validate_ep($username, $userpwd) { 
    $wsdl = "my web service path";
    $client = new SoapClient($wsdl); //(Parameter is the wsdl file in which the services are written.
    $newObj = new stdClass;
    $user_name = ucfirst($username);
    $user_pwd = md5($userpwd);
    $display_type = 'wp';

    try {
        $result = $client->log_process(array(0 => $user_name, 1 => $user_pwd, 2 => $display_type));              
        if ($result==FALSE)
            return FALSE;
        foreach($result->item as $key=>$valObj) {
            if(!is_numeric($valObj->key)) {
                $newObj->{$valObj->key} = $valObj->value;
            }
        }               

        /*$actual = unserialize(base64_decode($result));*/
        if (count($result) > 0) {
            $user = new WP_User;
            $user->init($newObj);
            return $user;
        }
    } catch (SoapFault $exp) {
        //print_r( $exp->getMessage());               
    }
    return false;
}

The result returned from web service

WP_User Object
(
    [data] => stdClass Object
    (
        [id] => ID
        [organization] => ID
        [login] => UserName
        [password] => ***
        [name] => Name

    )

    [ID] => 0
    [caps] => Array
    (
    )

    [cap_key] => wp_capabilities
    [roles] => Array
    (
    )

    [allcaps] => Array
    (
    )

    [filter] => 
)

Somebody please help what can I do after these steps.

like image 677
Ashish Avatar asked Nov 12 '13 03:11

Ashish


People also ask

How do I authenticate a WordPress user?

wp_authenticate( string $username, string $password ): WP_User|WP_Error. Authenticate a user, confirming the login credentials are valid.

How does WordPress handle authentication?

Cookie authentication is the standard authentication method included with WordPress. When you log in to your dashboard, this sets up the cookies correctly for you, so plugin and theme developers need only to have a logged-in user. However, the REST API includes a technique called nonces to avoid CSRF issues.

What is user authentication process?

User authentication verifies the identity of a user attempting to gain access to a network or computing resource by authorizing a human-to-machine transfer of credentials during interactions on a network to confirm a user's authenticity.

What are 3 ways to authenticate a user?

There are three common factors used for authentication: Something you know (such as a password) Something you have (such as a smart card) Something you are (such as a fingerprint or other biometric method)


1 Answers

I would suggest not to change WordPress core files as you did for user.php as it will be overwritten once WordPress core is upgraded. Instead I would suggest to go through the following article:

WordPress Replace built in user authentication

It has explanation in video presentation as well.

I am adding just summary below:

What to keep in mind when replacing the built-in authentication

WordPress relies heavily on it's built-in user system. Because of this there are lots of references to users in the WordPress database that are made. While slightly annoying, it is still fairly simple to work around these limitations.

WordPress requires that a real user (WordPress user) be present in the WordPress database in order to perform operations on that user. Luckily WordPress contains function to create, manipulate, and delete users. So when we build our service we will actually be taking the following steps, which should be fairly authentication type agnostic:

  • Authenticate user via alternate method
    • If invalid user display invalid login message
    • If valid user
      • Check to see if the user exists in the WordPress user table
      • If user exists load and return user data in a WP_User object
      • If user does not exist
        • Automagically create a new user from alternate authentication service user information
        • After creating the user load and return user data in a WP_User object
like image 79
Dharmang Avatar answered Sep 20 '22 13:09

Dharmang