web-dev-qa-db-fra.com

Intégration de système externe avec wordpress

J'écris une application web/db. Mes clients souhaitent une authentification selon que l'utilisateur est connecté ou non à WordPress.

En supposant que cette application soit hébergée depuis /wordpress, j'aimerais pouvoir:

  1. Déterminez qui est connecté à WordPress, le cas échéant.

    On dirait que cela devrait être possible via wp_get_current_user() mais je ne trouve aucune documentation détaillant les fichiers include à inclure pour que cela fonctionne. L'inclusion de /wp-includes/plugin.php et pluggable.php entraîne une erreur class WP_User not found de wp_get_current_user(). Je présume que certains fichiers d’inclusion requis ne sont pas inclus, mais lesquels?

  2. Lire les cookies WordPress

    Semble exiger une connaissance du hachage qui a été utilisé lors de leur création - comment cela peut-il être ggot?

Informations complémentaires: Les clients sont un groupe de plus de 300 artistes qui souhaitent

  • un site web géré dans WordPress et
  • un système de gestion des soumissions d'exposition,
  • une base de données de membres,
  • rotas,
  • rôles d'utilisateur
  • production de catalogue
  • règles de gestion détaillées/validation, autorisations, etc.

Cela se résume à diverses relations m: n. Ainsi, un système distinct fournissant un "administrateur de club" aux côtés de WordPress pour le site Web destiné au public semblait mieux adapté que WordPress avec des plugins sans fin à l'avenir incertain. Le groupe, naturellement, désire le SSO. OAuth ou similaire n'est pas une option puisque nous sommes limités à un seul compte d'hébergement partagé (cPanel).

UPDATE - solution simple trouvée - voir ma réponse ci-dessous

1
Gareth

SOLUTION:

Si l'application est hébergée à partir de la racine de wordpress (par exemple,/var/www/html/wordpress), ses scripts pourront lire les cookies restreints à la lecture par des scripts situés dans le chemin racine de wordpress.

siteurl est une variable wordpress qui, si vous ne voulez pas la coder en dur, peut être obtenue dynamiquement à partir de la table wp_options.

Wordpress stocke le nom d'utilisateur actuellement connecté dans un cookie appelé wordpress_logged_in_<md5HashOfSiteURL> avec un hachage du nom d'utilisateur et du mot de passe wordpress. Cela peut être scindé/obtenu par manipulation de chaîne, comme indiqué dans le code ci-dessous.

Merci à @PeterTomasScott pour ces informations: https://softwareengineering.stackexchange.com/questions/312861/why-do-some-web-apps-append-random-strings-to-cookie -names

Ceci (PHP) semble fonctionner comme souhaité:

$hash=md5("http://localhost/wordpress"); // or get dynamically from db $wpcookie=$_COOKIE["wordpress_logged_in_$hash"]; $stop=strpos($wpcookie,"|"); $currentusername=substr($wpcookie,0,$stop);

Le contenu de $wpcookie après le premier "|" est un hachage du nom d'utilisateur et du mot de passe de l'utilisateur actuel (à partir de wp_users) pouvant être utilisé pour des contrôles de sécurité plus poussés.

J'ai abandonné une approche basée sur les fonctions wordpress, car Apache se plaignait de constantes non définies de WPxxx (les fonctions ne fonctionneraient donc pas et certains fichiers inclus plus loin dans la chaîne d'inclusion n'incluraient pas) malgré l'installation de wp sans réclamation. J'espère que quelque chose ne va pas avec mon installation, sinon c'est beaucoup de bidouillage pour réaliser quelque chose qui devrait être simple ... non?

Merci néanmoins à @kaiser pour votre aide.

0
Gareth

Jetez un coup d'œil à ce que wp_parse_auth_cookie() fait. Vous pouvez facilement le dupliquer étant donné que vous avez toutes les constantes de cookie disponibles.

Néanmoins, je déconseillerais fortement cela. Dans votre cas, j'essaierais d'intégrer autant que possible WordPress pour éviter la duplication d'un mécanisme d'authentification. Vous pouvez toujours utiliser n'importe quel code personnalisé (et vous connecter à des bases de données externes) à l'aide de plugins. Ajoutez simplement le commentaire d'en-tête de plug-in au processus d'amorçage de votre application personnalisée et vous êtes prêt à fonctionner. Vous pouvez également facilement afficher des données sur des pages d’administrateur personnalisées ou ajouter des modèles de page au site public afin de gérer les entrées de données à partir de là. Restreignez ensuite l'accès à l'application en utilisant is_user_logged_in() ou exit( wp_redirect( home_url() ) ); dans tous les autres cas.

Une autre option serait de créer une application personnalisée et de l'intégrer à WordPress via l'API REST (routes disponibles + addt. docs ). Utiliser WP comme simple fournisseur de données n'est alors pas si difficile.

0
kaiser