Non ho capito bene se si desidera che l'utente esegua l'autenticazione principalmente sulla propria applicazione node.js e quindi crei il cookie per WordPress, o viceversa, ma una volta capito come lo sta facendo WordPress, sarai in grado di realizzare entrambi.
Prima di tutto, WordPress usa un sacco di hash e di sali per proteggere i suoi cookie, quindi è necessario sapere dove questi hash e sali devono essere in grado di definire gli stessi valori per quelli sull'applicazione nodejs.
Su wp-config.php
troverete le costanti degli hash e sali che stiamo cercando, penso che basta per trasportare alla vostra applicazione nodejs i valori costanti per LOGGED_IN_KEY
, LOGGED_IN_SALT
, NONCE_KEY
e NONCE_SALT
. Potresti dare una migliore occhiata al file wp-includes/default-constants.php
dove WordPress mantiene i suoi valori costanti di default, presta attenzione al if (definito (..)) perché se la costante è definita altrove prima di questo file (probabilmente sullo wp-config.php
) il il valore sarà da quello non dal file wp-includes/default-constants.php
.
Ora, è necessario capire come WordPress crea i suoi cookie. Questo è un esempio di loggato biscotto:
Cookie Name: wordpress_logged_in_2801795354f6f1c2d2ab3b48033a8257
Cookie Value: admin|1392386298|647852d61caf4cfdea975d54ecb09ca8
Cookie Value: %user_login%|%cookie_expire_time%|%hashed_sliced_user_hashed_password%
Hai bisogno di fare la vostra applicazione nodejs capire questo cookie, essendo in grado di rompere proprio come WordPress.
Le funzioni per la creazione di cookie di autenticazione su WordPress risiede su wp-includes/pluggable.php
$logged_in_cookie = wp_generate_auth_cookie($user_id, $expiration, 'logged_in');
//...
setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);
Nota che la costante LOGGED_IN_COOKIE
è impostato di default su wp-includes/default-constants.php
, sullo stesso file si ha la costante COOKIEHASH
, è necessario trasportare il valore di affinché l'applicazione nodejs sia in grado di leggere e convalidare anche il nome del cookie, lo COOKIEHASH
è solo l'URL del sito Web con hash con md5.
if (!defined('COOKIEHASH')) {
$siteurl = get_site_option('siteurl');
if ($siteurl)
define('COOKIEHASH', md5($siteurl));
else
define('COOKIEHASH', '');
}
//...
define('LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH);
se non si desidera trasportare tutto ciò, è sufficiente impostare su wp-config.PHP Il costante LOGGED_IN_COOKIE
con il login nome del cookie che si desidera per WordPress e ritratto solo questa costante ai vostri nodejs, in questo modo:
//WordPress wp-config.php
define('LOGGED_IN_COOKIE', 'logged_in_'.'%privateHashKey%');
//NODEJS
var LOGGED_IN_COOKIE = 'logged_in_'+'%privateHashKey%';
E infine è necessario ritratto le funzioni wp_generate_auth_cookie
, wp_hash
e hash_hmac to your nodejs application if you want to create the cookie there, the first two functions reside on the file
wp-inclues/pluggable.php the
hash_hmac resides on
wp-includes/compat.php`.
if (!function_exists('wp_generate_auth_cookie')) :
//...
function wp_generate_auth_cookie($user_id, $expiration, $scheme = 'auth') {
$user = get_userdata($user_id);
$pass_frag = substr($user->user_pass, 8, 4);
$key = wp_hash($user->user_login . $pass_frag . '|' . $expiration, $scheme);
$hash = hash_hmac('md5', $user->user_login . '|' . $expiration, $key);
$cookie = $user->user_login . '|' . $expiration . '|' . $hash;
return apply_filters('auth_cookie', $cookie, $user_id, $expiration, $scheme);
}
endif;
volta capito che cosa sta facendo wp_generate_auth_cookie
funzione, sarete anche in grado di decodificare il cookie e autenticare gli utenti di WordPress sulla vostra applicazione nodejs.
Si noti che ciò che WordPress sta facendo per il valore del cookie registrato, sta semplicemente tagliando la password con hash per l'utente nel database, unendosi con il nome di accesso dell'utente e la scadenza (unix tempo) per il cookie, e tritare tutti insieme. Quindi crea il valore del cookie con il nome di login dell'utente, il tempo di scadenza per il cookie e l'hash che ha appena creato, con i primi due valori che può verificare "hash del token" con la password con hash dell'utente.
Si potrebbe voler sapere che per disconnettere un utente su WordPress è necessario passare la chiave nonce per l'utente sull'URL di logout, quindi se si desidera disconnettere un utente da WordPress dall'applicazione nodejs, è possibile trasportare le funzioni chiave nonce.
Se l'applicazione si trova in un sottodominio, è possibile dichiarare su wp-config.php
oppure WordPress utilizzerà semplicemente il dominio completo sul cookie e il cookie non sarà disponibile per i sottodomini.
define('COOKIE_DOMAIN', '.domain.com');
Spero che questo ti dia indicazioni migliori. In bocca al lupo.
Se hai la scelta tra Wordpress e Joomla per il CMS come faccio io, c'è un modulo [nodejs-joomla] (https://github.com/jlleblanc/nodejs-joomla) che rende le sessioni di condivisione tra Joomla e Nodo abbastanza facile. – alreadytaken