Adicionar autenticação a qualquer aplicativo PHP usando MySQL

PHP é uma linguagem de script do lado do servidor de código aberto que pode ser incorporada em HTML para construir aplicativos da web. Ele é usado para desenvolver aplicativos da Web dinâmicos e conectar o aplicativo a um banco de dados.

Neste guia, você aprenderá como construir um sistema de autenticação usando bancos de dados PHP e MySQL. Esperamos que você conheça os fundamentos de PHP e MySQL antes de começar.

Construindo o Layout Usando HTML e Bulma CSS

O front end deste projeto é construído usando HTML e Bulma CSS . Bulma CSS é uma das estruturas CSS populares usadas para projetar páginas da web. Você pode usar Bulma CSS importando o CSS minimizado do CDN para o seu arquivo PHP.

 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css">

Integrando banco de dados MySQL

MySQL é um sistema de gerenciamento de banco de dados SQL relacional usado para realizar operações CRUD nos dados. Este aplicativo da web usará phpMyAdmin para gerenciar o banco de dados.

phpMyAdmin é uma ferramenta de software livre escrita em PHP, destinada a gerenciar a administração do MySQL na web.

Você pode instalar o phpMyAdmin configurando um servidor WAMP em sua máquina Windows (ou XAMPP no Linux ) e visitar a seguinte URL

 http://localhost/phpmyadmin

A tela ficará assim:

Criando o banco de dados

Você pode criar o banco de dados usando consultas SQL ou através da GUI fornecida pelo phpMyAdmin . Neste aplicativo, o nome do banco de dados é auth e o nome da tabela também é users. Os atributos da tabela são id, nome de usuário, email e senha.

Veja como você pode criar o banco de dados e a tabela usando comandos SQL:

Saiba mais: os comandos SQL mais importantes que qualquer programador deve saber

 CREATE DATABASE auth;
CREATE TABLE users(
id int,
username varchar(255),
email varchar(255),
password varchar(500),
);

Conectando o aplicativo ao banco de dados

Crie um arquivo chamado db.php na pasta do seu projeto, onde você irá conectar seu banco de dados e importar este arquivo para outros arquivos PHP para usá-lo.

A conexão é estabelecida usando o método mysqli_connect () . Este método aceita quatro argumentos: o nome do servidor, o usuário, a senha e o nome do banco de dados.

Você pode usar a variável $ connection enquanto executa consultas importando o arquivo db.php para outros arquivos PHP.

 <?php
$connection = mysqli_connect("localhost", "root", "", "auth") ;
?>

Inscreva-se usando PHP

A primeira fase da construção de um sistema de autenticação envolve o registro ou inscrição. O layout do frontend da página de inscrição possui um formulário com uma ação que faz uma solicitação POST na página. Possui quatro campos de entrada: nome de usuário, e-mail, senha e senha de confirmação.

 <form class="card m-3 p-6 m-5 container mx-auto" action="./register.php" method="POST">

<h1 class="title is-1 has-text-center">Register Here</h1>
<input class="input is-primary mt-4" type="text" name="username" placeholder="Username">
<?php if ($usernameErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$usernameErrorMsg</p>" ?>

<input class="input is-primary mt-4" type="email" name="email" placeholder="Email">
<?php if ($emailErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$emailErrorMsg</p>" ?>

<input class="input is-primary mt-4" type="password" name="password" placeholder="Password">
<?php if ($passwordErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$passwordErrorMsg</p>" ?>

<input class="input is-primary mt-4" type="password" name="confirm-password" placeholder="Confirm Password">
<?php if ($confirmPasswordErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$confirmPasswordErrorMsg</p>" ?>

<button type="submit" name="submit" class="button is-primary mt-4">Register</button>
<p class="mt-2 text-center">Already have an account ? <a href="./login.php">Login</a></p>
</form>

O método isset () verifica se o botão está clicado ou não, já que pode acessar o botão Registrar usando a superglobal $ _POST [] .

Antes de tudo isso, você precisa importar o arquivo db.php para o arquivo register.php . Existem algumas variáveis ​​declaradas para a validação de entrada. Confira o código abaixo.

 include "./db.php";
$error = "";
$emailErrorMsg = "";
$usernameErrorMsg = "";
$passwordErrorMsg = "";
$confirmPasswordErrorMsg = "";

Validação de entrada na página de registro

Antes de prosseguir com a validação de entrada, você precisa obter acesso aos valores dos elementos de entrada usando $ _POST [] .

O método mysqli_real_escape_string () ajuda a remover caracteres especiais da string, pois eles podem causar ações maliciosas durante a execução de operações de consulta.

Relacionado: Como implementar validação de formulário do lado do cliente com JavaScript

 $username = mysqli_real_escape_string($connection, $_POST["username"]);
$email = mysqli_real_escape_string($connection, $_POST["email"]);
$password = mysqli_real_escape_string($connection, $_POST["password"]);
$confirmPassword = mysqli_real_escape_string($connection, $_POST["confirm-password"]);
if($username == ""){
$usernameErrorMsg = "Please enter your username";
}
if($email == ""){
$emailErrorMsg = "Please enter the email";
}else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$emailErrorMsg = "Please enter a valid email";
}
if($password == ""){
$passwordErrorMsg = "Enter your password";
}
if($confirmPassword == ""){
$confirmPasswordErrorMsg = "Enter confirm password";
}
if(strlen($password) < 6){
$passwordErrorMsg = "Enter a password greater than 6 characters";
}else if($password!=$confirmPassword){
$confirmPasswordErrorMsg = "Password and Confirm Password field should be same";
}

Em primeiro lugar, você verifica se os campos estão vazios ou não. Para o campo de entrada de email, você precisa verificar se o usuário inseriu um email válido ou não usando o método filter_var () . O comprimento do campo de senha deve ser maior que 6. Essas são as validações básicas com as quais você precisa cuidar ao construir qualquer aplicativo.

Se não houver erros, você pode prosseguir com a execução de comandos de consulta no arquivo register.php .

 if($error == "" && $emailErrorMsg == "" && $passwordErrorMsg == "" && $confirmPasswordErrorMsg == ""){
$query = "SELECT * FROM auth WHERE email = '$email'";
$findUser = mysqli_query($connection, $query);
$resultantUser = mysqli_fetch_assoc($findUser);

if($resultantUser){
$error = "User already exists";
}
$password = md5($password);
$query = "INSERT INTO auth (username, email, password) VALUES('$username', '$email', '$password')";
$insertUser = mysqli_query($connection, $query);

$_SESSION['username'] = $username;
$_SESSION['email'] = $email;
header("location: home.php");
}

Você deve executar uma consulta que verifique se o e-mail já existe no banco de dados ou não. O método mysqli_query () é usado para realizar todas as operações de consulta. Você tem que passar o resultado da consulta no método mysqli_query_assoc () . Este método converte o resultado em uma matriz associativa de strings.

Se o usuário já existir, será necessário exibir um erro com a mensagem: Usuário já existe. Caso contrário, você precisa inserir os campos no banco de dados. Como não é uma boa prática armazenar strings de senha em texto simples, o método md5 () converterá a senha em um hash e a salvará.

Uma vez que o usuário é armazenado no banco de dados, você precisa carregar o nome de usuário ou e-mail na superglobal $ _SESSION [] e redirecionar o usuário para a página inicial.

Uma olhada na tela inicial

O usuário só pode acessar a página inicial se estiver logado. Na página inicial, é necessário verificar se a SESSÃO existe ou não. Se não houver SESSÃO definida, você precisará redirecionar o usuário para a página de login.

Login usando PHP

Neste aplicativo, o usuário fará o login usando e-mail e senha. O layout HTML para login.php :

 <form class="card m-3 p-6 m-5 container mx-auto" action="./login.php" method="POST">
<h1 class="title is-1 has-text-center has-text-black">Login Here</h1>
<?php if ($error != "") echo " <div class='button is-danger is-light'>$error</div>" ?>
<input class="input is-primary mt-4" name="email" type="email" placeholder="Email">
<?php if ($emailErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$emailErrorMsg</p>" ?>

<input class="input is-primary mt-4" name="password" type="password" placeholder="Password">
<?php if ($passwordErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$passwordErrorMsg</p>" ?>
<button class="button is-primary mt-4" type="submit" name="submit">Login</button>
<p>Don't have an account? <a href="./register.php">Register here</a></p>
</form>

Autenticação do usuário

Você precisa validar as entradas da mesma forma como foi feito durante o registro do usuário.

 $email = mysqli_real_escape_string($connection, $_POST["email"]);
$password = mysqli_real_escape_string($connection, $_POST["password"]);
if($email == ""){
$emailErrorMsg = "Please enter the email";
}else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$emailErrorMsg = "Please enter a valid email";
}
if($password == ""){
$passwordErrorMsg = "Enter your password";
}

Quando não houver erros de validação, os valores dos campos de entrada serão executados na consulta SQL. Para obter o valor hash da senha, passe a senha no método md5 () .

 if($emailErrorMsg == "" && $passwordErrorMsg == ""){
$password = md5($password);
$query = "SELECT * FROM users WHERE email = '$email' AND password='$password'";
$find_user = mysqli_query($connection, $query);
if(mysqli_num_rows($find_user) == 1){
$_SESSION["email"] = $email;
while($row = mysqli_fetch_assoc($find_user)){
$_SESSION["username"] = $row["username"];
}

header("location:home.php");
}else{
$error = "Invalid credentials";
}
}

Após recuperar a senha com hash, passe o e-mail e a senha com hash na consulta SQL e execute-a usando o método mysqli_query () .

Ao obter o resultado, você precisa passá-lo no método mysqli_num_rows () . Se o método mysqli_num_rows () retornar o valor 1, então você pode autenticar o usuário.

Armazene o e-mail e o nome de usuário em $ _SESSION [] e redirecione o usuário para a página inicial.

Desconecte o usuário

A autenticação do usuário é feita usando a superglobal $ _SESSION [] . Para fazer logout do usuário, você precisa destruir a SESSION e redirecionar o usuário para login.php .

 session_start();
$_SESSION = array();
session_destroy();
header("Location: login.php");
exit;

Um sistema de autenticação seguro é importante

Você já aprendeu a adicionar um sistema de autenticação usando PHP e MySQL. Você pode levar este projeto para o próximo nível adicionando funcionalidades mais avançadas a ele ou então integrar este sistema em um projeto de grande escala como um aplicativo de mídia social, uma página de blog ou qualquer projeto importante. Continue aprendendo e construindo coisas novas o máximo que puder.

Quer saber mais sobre PHP? Existem muitas manipulações que você pode fazer com o conhecimento correto de PHP.