无法将值从Node Js传递回php

时间:2018-10-05 08:51:24

标签: php node.js

我在服务器上有一个具有功能的php文件,并且我还具有Node Js API。我想将Node Js的值传递给php脚本,然后将函数输出返回给node js。

我按照Christianhere的建议,使用cookie解析器对此进行了尝试。但这不起作用

php脚本

<?php
$max = $_COOKIE["usrMob"];  // Taken from cookie
$min = 1111;

$number = mt_rand($min, $max);  // Find random number
echo $number;   // Send back to Node Js
?>

Node.Js

const express = require("express");
const cookieParser = require('cookie-parser'); 

const app = express();
app.use(cookieParser('Your Secret'));


router.get('/cookie', function (req,res)
{
    // Set cookie
    res.cookie('userMax', '46556') // options is optional
    res.end();
    console.log("Cookie is : " + res.cookie);
})

1 个答案:

答案 0 :(得分:0)

  

我在服务器上有一个具有功能的php文件,并且我有Node Js   API也。我想将Node Js值传递给php脚本,然后返回   函数输出到节点js。

     

我在这里使用了Christian建议的cookie解析器来尝试此操作。但这不起作用

简短答案

  

由于 CORS ,无法共享COOKIES,您的nodejs服务器必须位于PHP服务器的允许来源列表中。

好答案

  

COOKIES在将用户设置/令牌/密码或一些敏感数据存储在浏览器上时非常有用,这些数据允许用户的浏览体验表现出与大多数用户决定不同的行为。

     

因此,除非不同的服务器之间进行通信,否则无法在请求中发送它们,除非允许它们离开“授权来源”,否则将通过cookie大量泄漏数据,向 CORS打个招呼 strong>(除非您不拥有目标服务器)。

     

示例:

     

您在TargetServer( TS )上有一个脚本,该脚本在用户执行某些操作时在其中设置cookie。用户完成脚本操作后,您想将数据发送回YourServer( YS ),当AJAX触发时,将不会像通常在{{ 1}}。   在您使用了一系列工具之后,又出现了另一个问题,您对 YS 提出的每个请求都会生成一个新的ID /会话(我正在查看您的PHPSESSID),这意味着您不会例如,您不知道该用户是否已登录,并且您确定自己早已登录(是的-他已登录,但在另一个会话文件中...)。

     

如何解决此问题

     
      
  1. 找到一种适当的机制来加密/解密脚本和php会知道的字符串。
  2.   
  3. TS YS 发送请求时,添加自定义    YS 期望的标题。例如localhost,PHP将看到传入的标头,将解码VersionOf('hey-give-me-the-session-id'),并将触发一些特殊的REQUEST-CUSTOM-HEADER: encodedVersionOf('hey-give-me-the-session-id'),并向您发送带有不同标头的响应{ {1}}。您的脚本现在将其保存在COOKIES中,因此您无需再次请求它。并在以后的请求中将其附加到标题中。
  4.   
  5. 如果PHP将传入的字符串识别为有效会话,则php可以使用if加载您知道其中包含数据的会话,请确保在RESPONSE-CUSTOM-HEADER: encodedVersionOf('here-is-the-session-id')之前设置session_id($incoming_id) < / li>   
  6. 我强烈建议将JWT用于此类事物或某些加密的stringify json,因此您可以拥有一个对象,例如{session_id:12idn3oind,userInfo:{name:'test'}}}。
  7.   
  8. 当涉及CORS时,通过标头交换数据是下一件好事。
  9.   

我曾经处理过这个示例,虽然不是很想做,但最终还是值得的。

您可以向php发送数据或从php接收数据,唯一的事情是应该使用标头,这样才不会影响php输出。 由于您同时拥有这两个服务器,因此可以执行以下操作:

最重要的是:

  1. session_id
  2. 确保已在网络服务器上启用session_start / npm install -S express
  3. 我们将使用自定义标题,因此您应该允许并公开它们:

.htaccess

headers_module

PHP

mod_headers

Node.JS

别忘了更改这些行以指向您的php服务器:

Header add Access-Control-Allow-Headers "node-request, node-response" Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" Header add Access-Control-Expose-Headers "node-request, node-response" Header add Access-Control-Allow-Origin "*"

index.js

<?php
    $max = @$_COOKIE["usrMob"];  // Taken from cookie
    $min = 1111;
    $number = rand($min, $max);  // Find random number
    echo $number;   // Send back to Node Js
    if( isset($_SERVER['HTTP_NODE_REQUEST'])){
       $req = json_decode($_SERVER['HTTP_NODE_REQUEST'], true);
       $data = array();
       // 'givemeanumber' is sent from Node.js server
       if( isset($req['givemeanumber']) ){
         $data = array(
             'number' => $number
         );

       }
       header('NODE-RESPONSE: '. json_encode(array("req" => $req, "res"=> $data)));
    }
?>

middleware.js

getFromPHP('localhost', '9999', '/path-to-php-script', {givemeanumber: 1})