Как вы проверяете, успешно ли пользователь вошел в систему после отправки запроса Ajax? - PullRequest
0 голосов
/ 20 июня 2020

Как правило, после того, как вы отправите запрос JS ajax на PHP бэкэнд, мне нужно добавить http_response_code (201); после проверки данных, представленных пользователем, находится прямо в коде PHP, поэтому я могу использовать then (), например, в ax ios? и если есть проблема в отправленных данных, мне нужно добавить http_response_code (401); поэтому часть catch () будет запущена, нужен ли этот http_response_code? (я имею в виду, как это работает?) Потому что я могу проверить, не является ли это внутренней ошибкой сервера (500) или просто ошибкой неавторизованного пользователя (401), чтобы показать удобное сообщение об ошибке для пользователя. вот как это делается в профессиональном проекте?

пример:

JS:

axios.post('http://localhost/PHPFiles/UserAuthentification.php',null,config)
                    .then((response) => {
                        if(response.status == 200)
                        this.GetData();
                    })
                    .catch((error) => {
                        if (error.response.status == 401) {
                              this.ShowUnauthorizedUserMessage();
                            }
                        if(error.response.status == 500){
                              this.ShowServerErrorMessage();
                            }
                    });

PHP:

<?php
$serverName = "localhost";
$userName = "root";
$userPassword = "";
$dataBase = "todosdbs";
try{
$con = new mysqli($serverName,$userName,$userPassword,$dataBase);
$data = json_decode(file_get_contents('php://input'),false);
$stmt = $con->prepare("SELECT userid,username,userpassword,useremail FROM users WHERE useremail = ?");
$stmt->bind_param("s",$data->currentUserEmailText);
$stmt->execute();
$result = $stmt->get_result();
}catch(exception $e){
    http_response_code(500);
    die("server error");
}
if($result->num_rows>0){
    try{
    $row = $result->fetch_array(MYSQLI_ASSOC);
    }catch(exception $e){
        http_response_code(500);
        die("server error!"); 
    }
    $pass = $row['userpassword'];
    if(password_verify($data->currentUserPasswordText,$pass)){
        http_response_code(200);
    }
    else{
        http_response_code(401);
        die("Unauthorized User!");
    }
}
else{
    http_response_code(401);
    die("Unauthorized User!");
}
?>

Так http_response_code (число); как вы проверяете, какой код выполнять следующим на стороне клиента из PHP backend? последний вопрос - код 201, правильный, чтобы сообщить стороне клиента, что запрос был успешно реализован в бэкэнде PHP, как в моем примере или его 200?

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

Вы можете сделать это таким образом, но выполнение серверных кодов ошибок может быть немного тяжелым для простой проверки пользователя / пароля. Лично я просто оставляю ответ в активном состоянии, например, если вы попадаете на страницу, которую ищете, и страница знает, что делать, я оставляю его как 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());
}
0 голосов
/ 21 июня 2020

Использование кодов состояния HTTP (2xx для успеха, 4xx для ошибок, ...) отлично подходит для получения общего представления о том, как прошел запрос. Обычно вы также хотите поместить дополнительные сведения в тело ответа, закодированные так, чтобы клиент мог легко их прочитать (например, JSON), чтобы дать клиентам более четкие подсказки об ошибке (и различать guish между все возможные результаты!).

Например, успешный ответ может иметь код состояния 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. Вы можете проверить Википедию для получения подробной информации о кодах состояния и некоторых подсказках о том, как их интерпретируют браузеры.

Боковое примечание: похоже, вы не возвращаете токены и не устанавливаете повар ie в В случае успешного входа в систему вы наверняка захотите сделать это, чтобы убедиться, что пользователь вошел в систему при последующих запросах.

Если вы ищете примеры аутентификации, вы можете посмотреть на серверы oAuth2 или API аутентификации Firebase например.

...