Сделаем дизайн страницы
login.php
Идем на сайт
https://bootstrapstudio.io/
Создаем папку api
и копируем туда все
файлы нашего api.
.htaccess
RewriteEngine on
RewriteRule
^([^/]+)/? index.php?url=$1 [L,QSA]
DB.php
<?php
class DB {
private $pdo;
public function
__construct($host, $dbname, $username, $password) {
$pdo = new
PDO('mysql:host='.$host.';dbname='.$dbname.';charset=utf8',
$username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo
= $pdo;
}
public function
query($query, $params = array()) {
$statement =
$this->pdo->prepare($query);
$statement->execute($params);
if(explode('
', $query)[0] == 'SELECT') {
$data =
$statement->fetchAll();
return
$data;
}
}
}
?>
index.php
<?php
require_once("DB.php");
$db = new DB("127.0.0.1",
"SocialNetwork", "root", "");
// 'REQUEST_METHOD' -
Какой метод был использован для запроса
страницы; к примеру 'GET', 'HEAD', 'POST', 'PUT'.
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 VALUE (:id, :token,
:user_id)', array(':id'=>null, ':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);
}
}
} else if
($_SERVER['REQUEST_METHOD'] == "DELETE") {
if ($_GET['url'] ==
"auth") {
if
(isset($_GET['token'])) {
if
($db->query("SELECT token FROM login_tokens WHERE
token=:token", array(':token'=>sha1($_GET['token'])))) {
$db->query('DELETE FROM login_tokens WHERE token=:token',
array(':token'=>sha1($_GET['token'])));
echo '{
"Status": "Success" }';
http_response_code(200);
} else {
echo '{
"Error": "Invalid token" }';
http_response_code(400);
}
} else {
echo '{
"Error": "Mal-formed request" }';
http_response_code(400);
}
}
}
else {
http_response_code(405);
}
?>
Файл
входа login.html
<!DOCTYPE
html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SocialNetwork</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/fonts/ionicons.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Clean.css">
<link rel="stylesheet" href="assets/css/styles.css">
</head>
<body>
<div class="login-clean">
<form method="post">
<h2 class="sr-only">Login Form</h2>
<div class="illustration"><i class="icon ion-ios-navigate"></i></div>
<div class="form-group">
<input class="form-control" type="text" id="username" name="username" placeholder="Username">
</div>
<div class="form-group">
<input class="form-control" type="password" id="password" name="password" placeholder="Password">
</div>
<div class="form-group">
<button class="btn btn-primary btn-block" id="login" type="button" data-bs-hover-animate="shake">Log In</button>
</div><a href="#" class="forgot">Forgot your email or password?</a></form>
</div>
<script src="assets/js/jquery.min.js"></script>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-animation.js"></script>
<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) // r - responce
},
error: function(r) {
setTimeout(function() {
$('[data-bs-hover-animate]').removeClass('animated ' + $('[data-bs-hover-animate]').attr('data-bs-hover-animate'));
}, 2000)
$('[data-bs-hover-animate]').addClass('animated ' + $('[data-bs-hover-animate]').attr('data-bs-hover-animate'))
console.log(r)
}
});
});
</script>
</body>
</html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SocialNetwork</title>
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="assets/fonts/ionicons.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css">
<link rel="stylesheet" href="assets/css/Login-Form-Clean.css">
<link rel="stylesheet" href="assets/css/styles.css">
</head>
<body>
<div class="login-clean">
<form method="post">
<h2 class="sr-only">Login Form</h2>
<div class="illustration"><i class="icon ion-ios-navigate"></i></div>
<div class="form-group">
<input class="form-control" type="text" id="username" name="username" placeholder="Username">
</div>
<div class="form-group">
<input class="form-control" type="password" id="password" name="password" placeholder="Password">
</div>
<div class="form-group">
<button class="btn btn-primary btn-block" id="login" type="button" data-bs-hover-animate="shake">Log In</button>
</div><a href="#" class="forgot">Forgot your email or password?</a></form>
</div>
<script src="assets/js/jquery.min.js"></script>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bs-animation.js"></script>
<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) // r - responce
},
error: function(r) {
setTimeout(function() {
$('[data-bs-hover-animate]').removeClass('animated ' + $('[data-bs-hover-animate]').attr('data-bs-hover-animate'));
}, 2000)
$('[data-bs-hover-animate]').addClass('animated ' + $('[data-bs-hover-animate]').attr('data-bs-hover-animate'))
console.log(r)
}
});
});
</script>
</body>
</html>
///////////////////////////////////////////////////////////////////
php://input позволяет получить сырые данные из запроса. Например, удобно для работы с api.
php://input возвращает все необработанные данные после HTTP-заголовков запроса, независимо от типа контента.
Данные, могут быть:
application/x-www-form-urlencoded ( application/x-www-form-urlencoded тип application/x-www-form-urlencoded для простых форм- application/x-www-form-urlencoded ) или
multipart/form-data-encoded (в основном multipart/form-data-encoded для загрузки файлов)
Это связано с тем, что это единственные типы контента, которые должны поддерживаться браузерами. Поэтому сервер и PHP традиционно не ожидают получения какого-либо другого типа контента (что не означает, что они не могли бы).
Если вы просто отправляете POST-ом обычную HTML-форму, запрос выглядит примерно так:
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
Но если вы много работаете с Ajax, может понадобиться обмен более сложными данными с типами (строка, int, bool) и структурами (массивы, объекты), поэтому в большинстве случаев JSON является лучшим выбором. Но запрос с JSON-полезной нагрузкой выглядел бы примерно так:
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
Теперь содержимое будет application/json (или, по крайней мере, ни один из вышеперечисленных), так что $_POST -wrapper из PHP не знает, как с этим справиться (пока).
Данные всё еще там, вы просто не можете получить к нему доступ через $_POST. Поэтому вам нужно получить его с "сыром" виде помощью file_get_contents('php://input') (если он не закодирован в формате multipart/form-data).
Это также способ доступа к XML-данным или любому другому нестандартному типу контента.
Комментариев нет:
Отправить комментарий