Páginas

SSO ASP.NET to WordPress: PHP Souce Code

Este post es la segunda parte del post SSO ASP.NET to WordPress, en donde puedes encontrar la explicación general del proyecto. Aquí puedes encontrar el código fuente PHP utilizado para establecer un 'Single Sign On' (SSO) entre una aplicación web ASP.NET (AppW) y un WordPress (WP).

Tal y como se indica en el post principal, los dos archivos necesarios para el SSO son un PHP (al que llamaré wp-login-asp.php - el nombre puede ser modificado al gusto de cada uno -) y un archivo .cs con las clases del proyecto .NET cuya explicación se encuentra en el post SSO ASP.NET to WordPress: ASP.NET Souce Code.

ARCHIVO wp-login-asp.php

La función principal de este archivo es ejecutar las solicitudes efectuadas desde la Aplicación Web, y realizar las llamadas a los métodos del WP que serán las encargadas de loguear, desloguear o solicitar el estado del login, del usuario actual.

Este archivo debe estar ubicado en el directorio raiz del WP, al mismo nivel que el archivo wp-login.php.


<?PHP
  include 'wp-load.php';
 
  require_once( ABSPATH . WPINC . '/user.php' );
  require_once( ABSPATH . WPINC . '/pluggable.php' );

  function GetXmlData($data_user, $data_error_num, $data_error_text)
  {
    //make XML output
    $temp_xml = '<?xml version="1.0" encoding="UTF-8"?>';
    $temp_xml .= '<object>';
   
    if ($data_error_num<=0) {
      //echo'login failed!';
      $temp_xml .= '<is_valid>'.$data_error_num.'</is_valid>';
      $temp_xml .= '<error_message>'.$data_error_text.'</error_message>';
    } else {
      //set xml data
      $temp_xml .= '<is_valid>1</is_valid>';
      $temp_xml .= '<error_message></error_message>';
      $temp_xml .= '<id>'.$data_user->ID.'</id>';
      $temp_xml .= '<user_login>'.$data_user->user_login.'</user_login>';
      $temp_xml .= '<user_pass>'.$data_user->user_pass.'</user_pass>';
      $temp_xml .= '<user_displayname>'.$data_user->user_firstname.
        ' '.$data_user->user_lastname.'</user_displayname>';
      $temp_xml .= '<user_nicename>'.$data_user->user_nicename.
        '</user_nicename>';
      $temp_xml .= '<user_email>'.$data_user->user_email.'</user_email>';
    }
    $temp_xml .= '</object>'; //close xml data
   
    return $temp_xml;
  }
 
  //get the variables from the post of another page
  $u_action =  $_REQUEST['Action'];
  $u_username = $_REQUEST['UserName'];
  $u_password = $_REQUEST['Pwd'];

  //set DATA XML output variable to export
  $data = "";

  //study cases
  switch ($u_action){
    case "logged_status":
      $current_user = wp_get_current_user();
      if ( 0 == $current_user->ID ) {
        $data = GetXmlData(null, 0, 'Current user is not logged');
      } else {
        $data = GetXmlData($current_user, 1, '');
      }         
      break;

    case "logout":
      wp_logout();
      wp_clear_auth_cookie();
      $data = GetXmlData(null, 0, 'El usuario actual ha finalizado su sesión');
      break;

    case "loggin":
      //build the array
      $creds = array();
      $creds['user_login'] = $u_username;
      $creds['user_password'] = $u_password;
      $creds['remember'] = true;

      //log the user in
      $user = wp_signon( $creds, false );
      $error_num;
      $error_msg = '';
      if ( is_wp_error($user) )
      {
        $error_num = -1;
        $error_msg = $user->get_error_message();
      } else {
          $error_num = 1; //no error
      }
      $data = GetXmlData($user, $error_num, $error_msg);
      break;

    default:
      $data = GetXmlData(null, -1, 'No action is defined');
      break;
  }

  print_r($data);
?>

Si analizamos el código fuente, podremos encontrar los siguientes elementos:

· Función GetXmlData:
Se trata de una función auxiliar, que devuelve una respuesta a la aplicación en formato Xml. Aunque no es necesario que la respuesta se devuelva en este formato, he preferido utilizarlo porque permite una mayor facilidad a la hora de tratar los datos devueltos desde el lado de la AppW asp.net. Simplemente es un wrapper que formatea la información de salida del WP.

· Sentencia SWITCH:
Ejecuta las acciones necesarias en funcion del parametro "Action" enviado desde la AppW. Tal y como cada opcion indica, cada apartado se encarga de: averiguar el estado del usuario actual ('logged_status'), desloguear al usuario actual ('logout') eliminando las cookies de registro, ó autenticar al usuario actual ('loggin').

NOTA IMPORTANTE: Todas estas funciones se ejecutan a petición de la AppW, siendo independientes del proceso de login del WP. Si un usuario se autentica directamente en el WP, se generarán las cookies de su registro, y posteriormente las tendremos que recoger del lado .NET y hacer la llamada a la acción 'logged_status' para obtener los datos del usuario registrado en ese momento. En el .NET Source Code, explico el proceso con más detenimiento.

Puedes obtener más información en:
· SSO ASP.NET to WordPress: Single Sign On
· SSO ASP.NET to WordPress: ASP.NET Souce Code

Un saludo a todos!

No hay comentarios:

Publicar un comentario