2014-06-11 19 views
5

Sto cercando di replicare qualche Node JS in PHP ma non riesco a farlo funzionare! Il nodo è sotto;Nodo da JS a PHP, impossibile farlo funzionare

function initLogin(callback) { 
    debug('Getting login'); 
    request.get({ 
      url: psnURL.SignIN 
      , headers : { 
       'User-Agent': 'Mozilla/5.0 (Linux; U; Android 4.3; '+options.npLanguage+'; C6502 Build/10.4.1.B.0.101) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 PlayStation App/1.60.5/'+options.npLanguage+'/'+options.npLanguage 
      } 
     } 
     , function (error, response, body) { 
      (typeof callback === "function" ? getLogin(callback, psnVars.SENBaseURL + response.req.path) : getLogin(undefined, psnVars.SENBaseURL + response.req.path)); 
    }) 
} 
/* 
* @desc  Login into PSN/SEN and creates a session with an auth code 
* @param Function callback - Calls this function once the login is complete 
*/ 
function getLogin(callback, url) { 
    request.post(psnURL.SignINPOST 
     ,{ 
      headers: { 
       'Origin':'https://auth.api.sonyentertainmentnetwork.com' 
       ,'Referer': url 
      } 
      ,form:{ 
       'params'  : 'service_entity=psn' 
       ,'j_username' : options.email 
       ,'j_password' : options.password 
      } 
     }, function (error, response, body) { 
      request.get(response.headers.location, function (error, response, body) { 
       if (!error) { 
        var urlString = unescape(response.req.path); 
        psnVars.authCode = urlString.substr(urlString.indexOf("authCode=") + 9, 6); 
        debug('authCode obtained: ' + psnVars.authCode); 
        getAccessToken(psnVars.authCode, callback); 
       } 
       else { 
        debug('ERROR: ' + error) 
       } 
      }) 
     } 
    ) 
} 

E il mio PHP che non riesco a lavorare;

$c = curl_init(); 
curl_setopt_array($c, array(

    CURLOPT_URL => $PSNSignIn, 
    CURLOPT_USERAGENT => $userAgent, 
    CURLOPT_HEADER => true, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => 2, 
    CURLOPT_COOKIEJAR => realpath('/tmp/cookieJar.txt'), 
    CURLOPT_FAILONERROR => 1, 

)); 
$res = curl_exec($c); 

$path = explode($SENBaseURL, curl_getinfo($c, CURLINFO_EFFECTIVE_URL)); 
$referer = $SENBaseURL . $path[1]; 

var_dump(file_get_contents('tmp/cookieJar.txt'), $res); 

$c = curl_init(); 
curl_setopt_array($c, array(

    CURLOPT_URL => $SignINPOST, 
    CURLOPT_USERAGENT => $userAgent, 
    CURLOPT_REFERER => $referer, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => 2, 
    CURLOPT_HEADER => array(
     'Origin: https://auth.api.sonyentertainmentnetwork.com', 
     'Content-Type: application/x-www-form-urlencoded', 
    ), 
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => array(

     'params' => 'service_entity=psn', 
     'j_username' => $username, 
     'j_password' => $password, 
    ), 
    CURLOPT_COOKIEFILE => 'tmp/cookieJar', 
    CURLOPT_FAILONERROR => 1, 
)); 

$res = curl_exec($c); 

var_dump($res, curl_getinfo($c)); 

Si suppone di login nel server di Sony e recuperare un codice OAuth, il Node.js sta lavorando in modo è possibile, ma io non riesco a farlo funzionare in PHP.

Qualsiasi aiuto sarebbe molto apprezzato.

Il CURL sta funzionando ma ottengo un ?authentication_error=true quando deve restituire un codice che posso utilizzare.

+0

è il tuo tipo di contenuto corretto? 'Content-Type: application/x-www-form-urlencoded' – Dan

+0

Accertati di aver attivato avvisi/avvisi, in modo che i tuoi vars non possano vedere (ad esempio '$ userAgent') sollevare l'allarme se non sono accidentalmente nel campo di applicazione. – halfer

+0

Sì, sono tutti nella portata, come nota a margine la piena node.js api può essere trovata qui https://github.com/jhewt/gumer-psn e anche una sua implementazione PHP può essere trovata qui, https://github.com/ilendemli/gumer-psn-php – user2251919

risposta

2

Hai trovato Authentication Error perché, in linea di

CURLOPT_COOKIEFILE => 'tmp/cookieJar` 

È sta utilizzando il valore errato per cookieJar per CURL. Devi aggiungere .txt e correggere il percorso di un percorso assoluto come hai usato in precedenza nel tuo codice. Ecco perché CURL ti sta lanciando un Authentication Error

Correggere questo con il seguente dovrebbe risolvere i tuoi problemi.

CURLOPT_COOKIEFILE => '/tmp/cookieJar.txt` 


anche modificare la riga seguente

var_dump(file_get_contents('tmp/cookieJar.txt'), $res); 

Ti piace questa:

var_dump(file_get_contents('/tmp/cookieJar.txt'), $res); 
1

Come accennato nei commenti che hai utilizzato i percorsi relativi in ​​due occasioni e nell'ultimo utilizzo si omesso il .txt:

$c = curl_init(); 
curl_setopt_array($c, array(

    CURLOPT_URL => $PSNSignIn, 
    CURLOPT_USERAGENT => $userAgent, 
    CURLOPT_HEADER => true, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => 2, 
    CURLOPT_COOKIEJAR => realpath('/tmp/cookieJar.txt'), 
    CURLOPT_FAILONERROR => 1, 

)); 
$res = curl_exec($c); 

$path = explode($SENBaseURL, curl_getinfo($c, CURLINFO_EFFECTIVE_URL)); 
$referer = $SENBaseURL . $path[1]; 

var_dump(file_get_contents('/tmp/cookieJar.txt'), $res); 

$c = curl_init(); 
curl_setopt_array($c, array(

    CURLOPT_URL => $SignINPOST, 
    CURLOPT_USERAGENT => $userAgent, 
    CURLOPT_REFERER => $referer, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => 2, 
    CURLOPT_HEADER => array(
     'Origin: https://auth.api.sonyentertainmentnetwork.com', 
     'Content-Type: application/x-www-form-urlencoded', 
    ), 
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => array(

     'params' => 'service_entity=psn', 
     'j_username' => $username, 
     'j_password' => $password, 
    ), 
    CURLOPT_COOKIEFILE => '/tmp/cookieJar.txt', 
    CURLOPT_FAILONERROR => 1, 
)); 

$res = curl_exec($c); 

var_dump($res, curl_getinfo($c)); 
Problemi correlati