如何通过Ajax请求或每次加载页面来验证用户?

hea*_*low 4 php authentication ajax jquery codeigniter

这是一个非常简单的问题 - 虽然我现在正在思考这个问题,因为我开始了我的第一个真实世界和相当宏伟的(在大小方面)项目.

如何在发送Ajax request通道时验证用户的身份(用户名和密码)PHP?似乎有一个简单的解决方案:在请求中同时发送用户名和密码POST variables以及其他人,但在我看来,解决方案效率很低(因为每次请求都必须检查数据库)并且对于不同的Ajax请求来说是非常多余的).

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

如果它能帮助任何人提出一个很好的解决方案 - 我使用的是JQuery AJAX库和CodeIgniter PHP框架.

谢谢!

Gre*_*reg 5

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.
}
Run Code Online (Sandbox Code Playgroud)

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

使用PHP中的会话变量,一个cookie 使用,但它不识别该用户所有,而识别客户端和服务器之间的连接.

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