2013-08-01 18 views
5

Qual è il modo migliore per consentire a un utente di utilizzare un'app node.js utilizzando il proprio account utente da una pagina di Wordpress?Autenticazione di Wordpress in node.js

Ho provato a memorizzare le informazioni sulla sessione in Redis, ma non ho molta dimestichezza con PHP e sono incappato in un vicolo cieco in cui la sessione non viene archiviata. Ho usato questo guide.

Ho anche provato a utilizzare node-phpass ma non è molto ben documentato. Mi sono collegato correttamente al database Wordpress, ma gli hash delle password che ho generato con node-phpass non corrispondono agli hash nella tabella wp_users.

questo è quello che sto usando per testare nodo-phpass:

var mysql  = require('mysql'); 
var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'wordpress', 
    password : 'jPWrwvGbYXMADd8F', 
    database : 'wordpress', 
}); 

connection.query('SELECT * FROM wp_users', function(err, rows) { 
    if (err) { 
     console.log("Database error: " + err); 
    } else { 
     for (var i = 0; i < rows.length; i++){ 
      console.log("Rows[" + i + "] : " + rows[i].user_login + " " + passwordHash.checkPassword('secret',rows[i].user_pass)); 
     } 
    } 
}); 

A parte la condivisione della sessione, ci sono altri modi migliori per fare questo? OAuth?

+0

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

risposta

2

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.

0

La versione wordpress-auth installata utilizzando il metodo di installazione npm non è aggiornata. Scarica e utilizza la versione dal sito Web dei moduli.

Problemi correlati