FastAuth é um enxuto, simples e fácil de usar (easy-to-use) autenticador em PHP. Seu principal objetivo é eliminar o máximo a configuração, sendo simples de colocar em qualquer aplicação PHP.
- Conta com um formulário de login HTML, simples e limpo - facilmente personalizável;
- OTP token para validação de sessão (login);
- OTP token para validação de formulário HTML;
- Exigência de força de senha para cadastramentos com Passmeter;
- Usa password_hash PHP para armazenamento e verificação de senhas;
- Faz uso de ocultação do nome de usuário no banco de dados (JSON) através de hash_hmac o que aumenta um pouco a dificuldade do atacante em caso de comprometimento da base.
- Faz verificação automática do status da autenticação e, exige novo login se necessário;
- Não exige nenhum tipo de tratamento do login, de verificação de login e da situação do login. Nada!
- Saiba qual o usuário está autenticado (e-mail) através da função jeancarloem\FastAut\Auth();
- Controle de Acesso (ACL) via códigos.
- Totalmente compatível com Manipuladores de Sessão Personalizados. Ver sessão específica.
- Internacionalização de idioma (i18n) por meio de arquivos json. Na atualidade, apenas PT disponível;
- Base de dados em JSON - facilita o uso e manutenção (arquivos .pu, .at e .acl);
- Permite utilizar outros Bancos de Dados, tais como MySQL, Maria DB e Postgree, mediante plugin (mais informação no título "Banco de Dados").
É fácil:
- Clone o projeto na raiz de seu site (como public_html);
- Em seu arquivo index.php, inclua o login.php no início, antes de qualquer coisa;
require_once "[path-to-FastAuth]/login.php";
- Defina
jeancarloem\FastAut\FastAuth::$config["passmeter"]
com a url para Passmeter, caso necessário, por padrão irá apontar "lib\FastAuth\www\lib\Passmeter\src\Passmeter.js";
Pronto! Se quiser saber qual usuário está autenticado, use a função Auth que retorna o nome do usuário (e-mail).
Para o primeiro uso e configuração inicial vá para o título Configuração..
O banco de dados padrão (em json) é composto de três arquivos, um .pu para nomes de usuários e senhas, um .at para autorizações de registro e um .acl para controle de acesso; todos arquivos são JSON. Eles devem ser encontrados no mesmo diretório do seu arquivo "index.php".
NOTA: No primeiro uso NÃO haverá usuário registrado, precisará fazê-lo manualmente, CRIANDO e editando o arquivo .at, OU o arquivo .pu.
A composição do arquivo .pu:
{
"[hash_hmac-nome-do-usuario]":"[password_hash-da-senha]"
}
A composição do arquivo .at:
{
"[codigo-de-autorizacao-enviado-no-email]":"[hash_hmac-nome-do-usuario]"
}
A composição do arquivo .acl:
{
"[hash_hmac-nome-do-usuario]":{
"[codigo-do-acesso]":"[conteudo-mixed]"
}
}
** NOTA: o Código de acesso "FastAuthAdd" é reservado para FastAuth, seu conteúdo é booleano e, concede acesso para adição (convite) de usuários.
O hash do nome do usuário (e-mail) é obtido da seguinte forma:
strtoupper(hash_hmac('sha512', $username, hash('whirlpool', $username)))
A senha NÃO é armazenada, mas apenas o hash, obtido pelo comando password_hash, com custo mínimo 12, usando PASSWORD_DEFAULT.
Para acesso ao Banco de Dados, FastAuth utiliza uma interface denominada iBD. Por isso é muito simples criar um novo plugin de Banco de Dados que habilite Mysql, SQLite, MariaDB, Postgree, dentre outros.
O arquivo da interface está localizado em lib/iBD.php
, confirá lá! Para criar um novo plugin, declare uma Classe que Implemente a Interface iBD, salvando esta classe em um arquivo arquivo PHP com o mesmo nome da classe, e coloque-o na pasta lib/BDs/[nome-da-minha-classe].php
. Pronto!
Agora, para ativar o seu plugin, você precisa setar jeancarloem\FastAut\FastAut::$config["BD"]
para o nome da sua classe. Lembre que PHP é caso sensível:
jeancarloem\FastAut\FastAut::$config["BD"] = "MyClassPLuginBD";
** NOTA: A implementação personalizada NÃO deve fazer qualquer tratamento no nome de usuário e senha, pois os tratamentos necessários já são realizados no FastAuth.
IMPORTANTE: É possível ter acesso direto (sem barreiras) ao objeto de banco de dados atraves do método jeancarloem\FastAut\FastAut::BD()
. Use com moderação [rs].
Se você estiver usando FastAuth com o Banco de Dados padrão em json, abaixo segue orientações de configuração para primeiro acesso.
A forma mais simples de criar o primeiro usuário é criando o arquivo .at, inventando um código qualquer para [codigo-de-autorizacao-enviado-no-email]
, como “abc” ou "123".
O cadastramento do usuário é realizado acessando a URL ?fastauth_cadastrar=[codigo-de-autorizacao-enviado-no-email]
.
** Note que este procedimento também permite refazer a senha! Portanto, sempre que necessário, basta reenviar um código. Este procedimento somente é permitido para usuários não autenticados.
Para adicionar um usuário, após o cadastramento do primeiro e, estando logado, acesse sua URL com ?fastauth_resetuser=[e-mail-a-ser-adicionado]
. Isso criará uma entrada no arquivo .at, além de enviar um e-mail com o código de cadastramento a ser usado na URL ?fastauth_cadastrar
mencionada do título anterior.
Este comando somente é permitido para usuários cadastrados que possuam código de acesso FastAuthAdd, ou para usuários não autenticados - como forma de recuperar de senha - desde que neste caso, o e-mail exista no cadastro .pu.
** NOTA: Caso o e-mail não exista o programa se comportará de forma semelhante, mitigando identificação de e-mail cadastrados por força bruta.
Toda configuração passível de personalização é configurada no array jeancarloem\FastAut\FastAuth::$config
.
As seguintes chaves (índices) estão habilitados:
- passmeter define a URL do passmeter, por padrão
lib\FastAuth\www\lib\Passmeter\src\Passmeter.js
. - BD define o nome da classe (plugin) de controle de banco de dados personalizado. Ao setá-la, criando uma implementação própria, é possível fazer FastAuth funcionar com Mysql, SQlite, XML, dentre outros.
- BD-PARAM um parâmetro a ser fornecido ao construtor da classe de Banco de Dados.
- OTP-TIME define o tempo de validade (em segundos) do Token OTP, por padrão 10 minutos (600 segundos).
- OTP-DISABLE booleano que define se o recurso OTP deve ser desabilitado. Por padrão false. NOTA: por questões de segurança, a desabilitação deste NÃO impacta na verificação de token de formulário HTML.
- SESS-TIME define o tempo de validade (em segundos) da Sessão Autenticada, por padrão 10 minutos (600 segundos).
Os Manipuladores de Sessão Personalizados são suportado, porem tenha em mente que eles devem ser implementados e inicializados antes do primeiro uso de FastAuth no programa, já que na construção do objeto, FastAuth iniciará a sessão invocando o comando session_start()
- caso a mesma ainda tenha sido inicializada.
Considerando que o objetivo do FastAuth é ser simples de usar, ele não deve ser usado sem uma prévia consideração quanto a segurança, já que existem questões de segurança NÃO implementadas, e as que foram implementadas NÃO estão livres de falhas. Melhoramentos serão liberados eventualmente, contribua também!
Note que o banco de dado está acessível via URL, embora não seja uma boa prática "terceirizar" a segurança de um software, neste caso, a proteção/bloqueio do mesmo deverá ser implementada no servidor. Exemplos a seguir (não testados):
Direto na configuração:
<FilesMatch "\.?.+$">
order allow,deny
deny from all
</FilesMatch>
Via .htaccess:
RewriteRule /?\..+$ [F,L]
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
** Uso de senha para autenticação único fator, normalmente NÃO é uma boa escolha! ** Uso de cookie e sessão é necessário para funcionamento deste software.
Dê preferência por usar Netbeans como editor, por causa da formatação. Todos os arquivos foram formatados com a formatação automática fornecida por este aplicativo, em Código Fonte -> Formatar
. Isso facilita a diferenciação e identificação de mudanças.
Ao adicionar recursos, procure sempre que possível manter o estilo de programação, para compatibilidade e não deixe de comentar.
Um projeto de Jean Carlo EM. Licensiado sob Mozilla Public License 2.0+.
Eu agradeço se ao utilizar este software comunicar formalmente com detalhes do uso e URL para acesso. E uma doação sempre será bem vinda. Obrigado! :)