API POST Auth всегда возвращает 200, но имеет ошибку 401 - PullRequest
0 голосов
/ 17 января 2019

Позвольте мне сначала сказать, что я много исследовал и понятия не имею, что происходит, почему, когда я вхожу с «неправильным» паролем или пользователем, сетевой статус авторизации говорит 200, но консоль сообщает об ошибке: Неверное имя пользователя или пароль. Таким образом, он показывает правильную ошибку, но имеет статус 200, который является неправильным. Статус должен быть 401.

в качестве альтернативы, когда я ввожу правильную информацию, это корректные учетные данные, это дает мне токен, как и ожидалось. Проблема в статусе 200, когда это должен быть статус 401. Пожалуйста, помогите мне выяснить, почему статус не возвращается правильно. И ДА НУЖНО вернуть 401, чтобы другая часть моего кода работала правильно.

Вот изображение того, что оно говорит:

the Devtools

Вот мой код авторизации POST (за исключением соединения с БД, которое подключается):

 <?php
   if ($_SERVER['REQUEST_METHOD'] == "GET") {
   if ($_GET['url'] == "auth") {
    } else if ($_GET['url'] == "users") {
   }
   } else if ($_SERVER['REQUEST_METHOD'] == "POST") {
     if ($_GET['url'] == "auth") {
       $postBody = file_get_contents("php://input");
       $postBody = json_decode($postBody);
       $username = $postBody->username;
       $password = $postBody->password;
    if ($db->query('SELECT username FROM users WHERE username=:username', array(':username'=>$username))) {
        if (password_verify($password, $db->query('SELECT password FROM users WHERE username=:username', array(':username'=>$username))[0]['password'])) {
            $cstrong = True;
            $token = bin2hex(openssl_random_pseudo_bytes(64, $cstrong));
            $user_id = $db->query('SELECT id FROM users WHERE username=:username', array(':username'=>$username))[0]['id'];
            $db->query('INSERT INTO login_tokens VALUES (\'\', :token, :user_id)', array(':token'=>sha1($token), ':user_id'=>$user_id));
            echo '{ "Token": "'.$token.'" }';
        } else {
            echo '{ "Error": "Invalid username or password!" }';
            http_response_code(401);
        }
     } else {
        echo '{ "Error": "Invalid username or password!" }';
        http_response_code(401);
     }
 }

 } 
 ?>

Вот мой код формы:

 <script type="text/javascript">
    $('#login').click(function() {

        $.ajax({

            type: "POST",
            url: "api/auth",
            processData: false,
            contentType: "application/json",
            data: '{ "username": "'+ $("#username").val() +'", "password": "'+ $("#password").val() +'" }',
            success: function(r) {
                console.log(r)
            }

        });
    });
 </script>

Также вот что говорит dev:

URL запроса: http://ustylz.com/api/auth Способ запроса: POST Код состояния: 200 ОК Удаленный адрес: xx.xx.1xx.2xx: xx Политика реферера: no-referer-when-downgrade

Я ожидаю, что когда я нажму кнопку $ login с неверным именем пользователя или паролем, DEVtools в chrome покажет Auth красным цветом и будет иметь статус 401.

1 Ответ

0 голосов
/ 17 января 2019

Вы не можете использовать «заголовок» после эха или любого вывода. http_response_code пытается вставить параметр заголовка после того, как вы повторили ошибку. Таким образом, код ответа - 200, и в файле журнала вашего сервера вы найдете предупреждение об этой проблеме (если ошибки не отключены).

...