如何通过 Ajax 请求或每次页面加载对用户进行身份验证


How does one authenticate a user via Ajax requests or on every page load?

这是一个

非常简单的问题 - 尽管当我开始我的第一个现实世界和相当宏伟(就规模而言)项目时,我现在正在考虑这个问题。

当通过PHP发送Ajax request时,我将如何验证用户的身份(用户名和密码)?似乎有一个简单的解决方案:将用户名和密码与请求中的其他用户名和密码一起发送POST variables但在我看来,该解决方案效率非常低(因为它必须在每次发出请求时检查数据库,并且对于不同的 Ajax 请求非常冗余)。

我调查了Twitter如何处理他们的Ajax请求(例如发布新推文),我没有看到他们在请求中发送任何身份验证信息 - 但他们怎么知道实际上是我,我的个人资料的所有者,发送Ajax请求发布新推文?

如果它可以帮助任何人提出一个很好的解决方案 - 我正在使用JQuery AJAX库和CodeIgniter PHP框架。

谢谢!

Ajax 请求与任何其他 HTTP 请求完全相同。无论是通过JavaScript还是通过在浏览器的地址栏中键入URI来完成,它们都是HTTP请求。

您是对的,通过HTTP发送用户名和密码是错误的解决方案。但是,通常需要发送一次用户名/密码,但这只能在HTTPS上完成,这样它就不会以纯文本形式发送。通过身份验证后,您可以将用户 ID 存储在服务器端会话变量中,以便在将来的请求中进行访问。

一些伪代码可以帮助您:

if(!empty($_SESSION["userId"])) {
    // User is authenticated. Do something.
}
else if(!empty($_POST["username"])) {
    // User is attempting to log in. Check against database.
    $userId = getUserIdByUsernamePassword($_POST["username"], $_POST["password"]);
    // Store user id in session variable.
    if($userId > 0) {
        $_SESSION["userId"] = $userId;
    }
}
else {
    // User is not authenticated.
}

一个常见的陷阱是将身份验证存储在 Cookie 中。Cookie 存储在客户端,因此如果您这样做,任何人都可以通过创建自己的 cookie 来伪造身份验证。

在PHP中使用会话变量,使用cookie,但它根本不识别用户,而是标识客户端和服务器之间的连接。

但是,要成功验证实际项目,不应依赖会话 Cookie。相反,会话变量、UUID cookie 和加盐哈希 cookie 的组合可以提高身份验证的完整性......但这完全是另一个话题。

我认为最好的

方法(也许是唯一的方法)是让通过ajax请求的文件检查用户是否已登录(通过会话之类的东西)。我不建议将详细信息与请求一起发送,因为它们将位于源代码中通常不需要的某个地方。