【发布时间】: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 具有相同的域,但运行在不同的端口上。
现在我的代码所做的是:
- 我从 Node API 调用 signIn 函数
- 它创建 JWT 令牌并且用户在 Node 中正确连接
- 我这样称呼 PHP 网站:http://www.mysite.local/ajax/login?user=user&pass=pwd
- 它会正确创建会话文件
- 它创建 PHPSESSID cookie
但是当我检查我的域的 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 改变颜色。