2 回答

TA贡献1831条经验 获得超4个赞
您可以这样做,但是对于仅验证用户/通行证而言,执行基于服务器的错误代码可能有点笨拙。我个人只是将响应保持在活动状态,就像您点击您正在寻找的页面并且页面知道该做什么一样,我将其保留为200并发送回一个 json 数组,如下所示:
die(json_encode([
# $valid would be a boolean based on your login/pass validation success
'success' => $valid,
# Depending on success, show appropriate msg
'alert' => ($valid)? 'Successful login' : 'Invalid Username or Password',
# Send back data if necessary
'data' => false
]));
所以它可能看起来更像:
/functions.php
<?php
function connect()
{
return new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
}
function getUser($username, $con)
{
$stmt = $con->prepare("SELECT * FROM users WHERE useremail = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
if($result->num_rows == 0)
return false;
return $result->fetch_array(MYSQLI_ASSOC);
}
function userValid($user, $password)
{
return password_verify($password, $user['userpassword']);
}
function ajaxResponse($success, $data = false, $msg = false)
{
die(json_encode([
'success' => $success,
'data' => $data,
'msg' => $msg,
]));
}
/config.php
<?php
define('ROOT_DIR', __DIR__);
define('DB_HOST', "localhost");
define('DB_NAME', "todosdbs");
define('DB_USER', "root");
define('DB_PASS', "");
include(ROOT_DIR.'/functions.php');
/PHPFiles/UserAuthentification.php
<?php
include(__DIR__.'/../config.php');
# Send json header since that is what is returning
header('Content-Type: application/json');
try{
# Fetch the database connection
$con = connect();
# Fetch the post
$POST = json_decode(file_get_contents('php://input'),false);
# Fetch the user, inject username and db
$user = getUser($POST->currentUserEmailText, $con);
# Stop if username invalid
if(!$user) {
ajaxResponse(false, false, "Invalid user");
}
# Check validation
$response = (userValid($user, $POST->currentUserPasswordText))? [
'success' => true,
'data' => $user,
'msg' => 'User logged in successfully'
] : [
'success' => false,
'data' => false,
'msg' => 'Invalid username or password'
];
# Report back
ajaxResponse(...$response);
}
catch(\Exception $e) {
# Report back error if it occurs
ajaxResponse(false, false, $e->getMessage());
}

TA贡献1744条经验 获得超4个赞
使用 HTTP 状态码(2xx 表示成功,4xx 表示错误,...)对于大致了解请求的进展情况非常有用。通常,您还希望在响应正文中添加其他详细信息,并进行编码以便客户端可以轻松读取它们(例如 JSON),以便向客户端提供有关错误的更清晰的提示(并区分所有可能的结果!)。
例如,成功响应可能具有 200 状态代码并具有以下正文: {"type":"sucess", "message": "User logged in successfully"}
虽然无效的登录尝试通常会导致 403 状态代码,但响应可能如下所示: {"type":"error", "message": "Invalid username or password"}
但是,如果您想说明是否存在具有给定电子邮件的帐户(例如 Trello),那么您将为两个响应使用 403 状态代码,但具有不同的正文:
{"type":"error", "message": "There is no account corresponding to the given email"} {"type":"error", "message": "Invalid password"}
使用 401 状态码表示需要进行身份验证才能访问资源,如果用户浏览到此页面,通常浏览器会显示这样的登录提示(但这不适用于 ajax 请求)。失败的登录尝试应该得到一个 403 状态码。您可以查看Wikipedia以获取有关状态代码的详细信息以及有关浏览器如何解释它们的一些提示。
旁注:在成功登录的情况下,您似乎没有返回任何令牌或设置 cookie,您当然希望这样做以确保用户在后续请求中登录。
如果您正在寻找身份验证示例,您可以查看 oAuth2 服务器或Firebase 身份验证 API。
添加回答
举报