【问题标题】:Creating cookies by calling PHP website from Node API通过从 Node API 调用 PHP 网站来创建 cookie
【发布时间】:2020-06-02 17:39:10
【问题描述】:

我们目前的网站是用 PHP 编写的。我们目前正在 Node.js 中升级它。我们将逐步升级它,所以我们将在 PHP 中拥有一些页面,而在 Node.js 中拥有一些其他页面。 问题是,当用户连接时,我们必须确保他们在 PHP 和 Node 中都有会话,这样他们就不必连接两次。

在 PHP 中,我们创建一个 PHPSESSID cookie,并将所有数据存储在 /tmp 中的会话文件中。 在 Node 中,我们使用 JWT 令牌。

我现在想要实现的是:当用户连接到在 Node 上运行的页面时,它必须创建一个 PHPSESSID cookie 和会话文件,所以当他导航到另一个在 PHP 上运行的页面时,他仍将连接。

PHP 网站和 Node API 具有相同的域,但运行在不同的端口上。

现在我的代码所做的是:

但是当我检查我的域的 cookie 时,PHPSESSID 没有出现。但是在我创建它并在 PHP 中打印 $_COOKIE 之后它确实如此。 正因为如此,PHP 找不到任何 PHPSESSID cookie,也无法访问会话文件。

我正在使用带有 GraphQL 和 Apollo 的 Node,以及带有 Zend Framework 1.12 的 PHP

这是我如何使用 Node 调用 PHP:

const url = `http://www.mysite.local/ajax/login?email=${data.email}&password=${data.password}`
const headers = {
  Referer: 'http://www.mysite.local/auth'
}
await fetch(url, { method: 'GET', headers: headers })

PHP 中的会话由 Zend 管理

我正在 Firefox 上进行测试。

【问题讨论】:

  • “我这样称呼 PHP 网站”——嗯。那是JavaScript。是浏览器端 JavaScript 还是节点端 JavaScript?
  • 正如@Quentin 指出的那样,了解运行提议的 javascript 代码的运行时会很有用。无论如何,我会看看npmjs.com/package/node-fetch#extract-set-cookie-header。对于调试,至少查看是否从 http 请求中检索 cookie 可能很有用。
  • @Quentin 它是节点端 JavaScript
  • @MomoKebab – 如果您从 Node 发出请求,浏览器 不会存储 cookie。
  • @MomoKebab — 出于同样的原因,如果您(浏览器)请您的朋友(Node.js)将他们的手浸入一桶油漆中,您的手不会' t 改变颜色。

标签: php node.js cookies


【解决方案1】:

HTTP cookie 的工作方式如下:

  1. 客户端向服务器发送 HTTP 请求
  2. 服务器以包含 Set-Cookie 标头的 HTTP 响应进行响应
  3. 然后客户端存储cookie

稍后,客户端向同一服务器发送另一个 HTTP 请求。由于它有一个存储的 cookie,因此 cookie 包含在请求标头中。


浏览器通常会自动存储 cookie。 (有一些边缘情况,如 Ajax 请求仅在启用 withCredentials 时处理跨域请求中的 cookie)。

服务器端代码通常不会自动存储 cookie。在处理服务器端代码时,您通常需要显式处理 cookie,通常通过配置 cookie jar 库(例如 fetch-cookie)。


  1. 您正在从浏览器向 Node.js 发出 HTTP 请求。
  2. Node.js 正在向 PHP 发出 HTTP 请求。
  3. PHP 正在响应一个 cookie(我假设)
  4. Node.js 忽略了 cookie
  5. Node.js 正在对浏览器进行 HTTP 响应
  6. 浏览器获取 HTTP 响应(其中没有 Set-Cookie 标头)。

Node.js 绝不会从它向 PHP 发出的请求中读取 cookie,也不会在它对浏览器的响应中复制该 cookie。

这就是你需要做的。

(然后您需要继续通过 Node.js 代理对 PHP 的请求,因为存储在浏览器中的 cookie 将与 Node.js 服务器相关联)。

【讨论】:

  • 哇,谢谢,我不知道创建 cookie 的确切过程。我对我现在在做什么有了更好的理解。实际上,我目前正在阅读来自 PHP 的响应,发现其中包含 cookie(感谢@tin 的链接),并且我正在尝试设置收到的 cookie。它现在不起作用,但我想我必须将它发送给客户端。
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
相关资源
最近更新 更多