2 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以這樣做,但是對(duì)于僅驗(yàn)證用戶/通行證而言,執(zhí)行基于服務(wù)器的錯(cuò)誤代碼可能有點(diǎn)嚴(yán)厲。我個(gè)人只是將響應(yīng)保留在活動(dòng)狀態(tài),就像您點(diǎn)擊要查找的頁(yè)面并且該頁(yè)面知道要做什么一樣,我將其保留為并只發(fā)回一個(gè)200json 數(shù)組,如下所示:
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
]));
所以它可能看起來(lái)更像是:
/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貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
使用 HTTP 狀態(tài)代碼(2xx 表示成功,4xx 表示錯(cuò)誤,...)非常適合提供有關(guān)請(qǐng)求進(jìn)行情況的總體了解。通常,您還希望在響應(yīng)正文中添加其他詳細(xì)信息,并進(jìn)行編碼,以便客戶端可以輕松讀取它們(例如 JSON),以便向客戶端提供有關(guān)錯(cuò)誤的更清晰提示(并區(qū)分所有可能的結(jié)果?。?/p>
例如,成功響應(yīng)可能具有 200 狀態(tài)代碼并具有以下正文:?{"type":"sucess", "message": "User logged in successfully"}
雖然無(wú)效的登錄嘗試通常會(huì)導(dǎo)致 403 狀態(tài)代碼,并且響應(yīng)可能如下所示:?{"type":"error", "message": "Invalid username or password"}
但是,假設(shè)您想要說(shuō)明具有給定電子郵件地址的帳戶是否存在(例如 Trello),那么您將為這兩個(gè)響應(yīng)使用 403 狀態(tài)代碼,但具有不同的正文:
{"type":"error",?"message":?"There?is?no?account?corresponding?to?the?given?email"} {"type":"error",?"message":?"Invalid?password"}
使用 401 狀態(tài)代碼表示需要進(jìn)行身份驗(yàn)證才能訪問(wèn)資源,如果用戶瀏覽到此頁(yè)面,通常瀏覽器會(huì)顯示這樣的登錄提示(但這不適用于 ajax 請(qǐng)求)。失敗的登錄嘗試應(yīng)該得到 403 狀態(tài)代碼。您可以查看維基百科以獲取有關(guān)狀態(tài)代碼的詳細(xì)信息以及有關(guān)瀏覽器如何解釋它們的一些提示。
旁注:在成功登錄的情況下,您似乎不會(huì)返回任何令牌,也不會(huì)設(shè)置 cookie,您肯定希望這樣做以確保用戶在后續(xù)請(qǐng)求中登錄。
如果您正在尋找身份驗(yàn)證示例,可以查看 oAuth2 服務(wù)器或Firebase 身份驗(yàn)證 API。
- 2 回答
- 0 關(guān)注
- 200 瀏覽
添加回答
舉報(bào)