【发布时间】:2016-05-08 16:13:17
【问题描述】:
我正在尝试构建一个基于 PHP 的 REST API,但我遇到了这个问题。我在 PHP 代码中有 session_start() 和一个简单的登录、注销脚本,它接受相同的 username 和 password 进行身份验证:
<?php
session_start();
header("Access-Control-Allow-Origin: *");
header("Content-type: application/json");
$message = array();
if ($_GET["action"] == "signin") {
if (count($_POST) && isset($_POST["username"]) && isset($_POST["password"]) && $_POST["username"] == $_POST["password"]) {
$message["user"] = $_POST["username"];
$message["success"] = true;
$_SESSION["user"] = $message["user"];
} else {
unset($message["user"]);
$message["success"] = false;
unset($_SESSION["user"]);
}
} elseif ($_GET["action"] == "signout") {
session_destroy();
$message["success"] = true;
} elseif ($_GET["action"] == "whoami") {
$message["success"] = true;
$message["user"] = isset($_SESSION["user"]) ? $_SESSION["user"] : "Guest";
}
die(json_encode($message));
?>
我正在使用 POSTMan(Chrome 扩展程序)登录并检查,一切正常。但是当我使用我的 jQuery 的$.getJSON() 和$.post() 方法时,当我尝试action=whoami 时,我得到的是Guest。我的 jQuery 代码:
$.getJSON("http://localhost/api.php?action=whoami");
// Gives Guest. Okay! :)
$.post("http://localhost/api.php?action=signin", {
username: "admin", password: "admin"
});
// Gives me success with the user logged in.
$.getJSON("http://localhost/api.php?action=whoami");
// Gives Guest Again! :O
我已经用 POSTMan 尝试过同样的事情,而且效果很好。但是使用 jQuery 这不起作用。所以,我尝试使用:
$.ajaxSetup({
cache: false
});
尽管如此,我也尝试像这样附加一个随机字符串,但响应相同:
这个也不行。有人可以帮我继续吗?这对我来说是一个表演终结者。
$.getJSON("http://localhost/api.php?action=whoami");
// Gives Guest. Okay! :)
$.post("http://localhost/api.php?action=signin", {
username: "admin", password: "admin"
});
// Gives me success with the user logged in.
$.getJSON("http://localhost/api.php?action=whoami&kill=cache");
// Gives Guest Again! :O
【问题讨论】:
-
您是否从与 API 相同的端口运行应用程序 (javascript)?
-
是的,两者都在 80 端口,但域不同
-
你在做跨域请求吗?
-
@PraveenKumar 是的,其中一个建议是为域设置会话 cookie。我错过了什么吗?请纠正我,因为 AFAIK 它与会话 cookie 和不同的域有关
-
@PraveenKumar 我会给它+1 :) 我做到了
标签: javascript php jquery rest