【发布时间】:2020-05-21 12:56:54
【问题描述】:
我正在尝试制作一个简单的登录 PHP API 并通过 VueJS 从 Axios 调用它。
在尝试登录时,我将 axios POST 请求发送到同一域上的所需脚本,如下所示:
axios.post("/api/open/auth/login", {
data: {
username: this.name,
password: this.pass
}
})
然后在 PHP 中,我检查来自 POST 的插入数据,如果它是正确的,我会像这样设置会话变量(文件开头有 session_start()):
$_SESSION["userID"] = $row->id_users;
$_SESSION["username"] = $row->name;
到目前为止,这工作正常,我确信这部分代码运行正常并且应该设置会话变量,但是我创建了另一个脚本,应该通过检查这些会话变量来检查用户是否登录,例如所以:
if ( isset($_SESSION["userID"]) && isset($_SESSION["username"]) )
{
jsonResponseOk("Session is set.");
}
else
{
jsonResponseError("Session is not set.");
}
这是我无法理解的,虽然应该设置会话变量,但当我之前登录时,这总是落入ELSE。
【问题讨论】:
-
因为您访问的是 API,所以没有“会话”的概念。
-
PHP 向用户返回一个会话 cookie。您需要存储该 cookie 并将其包含在后续请求中。 (对于 API,这种设计可能并不理想,无状态很重要。)
-
@JayBlanchard 这对我来说似乎不正确,根据this thread 似乎同一域上的 ajax 请求自动包含会话 ID cookie,因此 PHP 应该能够读取基于会话数据这个ID之前设置的不是吗?
-
@PatrikŠticha:“自动包含会话 ID cookie” - 请再次仔细阅读该问题,并注意它与您的方案有何不同。特别是诸如“我有一个用户登录到我的网站”和“他点击了一个‘保存’按钮”之类的陈述。在这种情况下,用户手动与登录功能进行交互。浏览器在响应中接收 cookie,将其保存,并将其包含在后续请求中。那不是你在做什么。您正在为初始登录发出 AJAX 请求。您需要处理响应中生成的 cookie。