Autenticação
O AdonisJS vem com um sistema de autenticação robusto e seguro que você pode usar para fazer login e autenticar usuários do seu aplicativo. Seja um aplicativo renderizado pelo servidor, um cliente SPA ou um aplicativo móvel, você pode configurar a autenticação para todos eles.
O pacote de autenticação é construído em torno de guardas e provedores.
As guardas são implementações de ponta a ponta de um tipo de login específico. Por exemplo, a guarda
session
permite que você autentique usuários usando cookies e sessão. Enquanto isso, a guardaaccess_tokens
permitirá que você autentique clientes usando tokens.Os provedores são usados para procurar usuários e tokens em um banco de dados. Você pode usar os provedores integrados ou implementar os seus próprios.
NOTA
Para garantir a segurança dos seus aplicativos, fazemos hash adequadamente nas senhas e tokens dos usuários. Além disso, os primitivos de segurança do AdonisJS são protegidos contra ataques de temporização e ataques de fixação de sessão.
Recursos não suportados pelo pacote Auth
O pacote auth foca estritamente na autenticação de solicitações HTTP, e os seguintes recursos estão fora de seu escopo.
- Recursos de registro de usuário como formulários de registro, verificação de e-mail e ativação de conta.
- Recursos de gerenciamento de conta como recuperação de senha ou atualização de e-mail.
- Use bouncer para implementar verificações de autorização em seu aplicativo.
Escolhendo um auth guard
Os seguintes auth guards integrados fornecem a você o fluxo de trabalho mais direto para autenticar usuários sem comprometer a segurança de seus aplicativos. Além disso, você pode criar seus guardas de autenticação para requisitos personalizados.
Sessão
O guarda de sessão usa o pacote @adonisjs/session para rastrear o estado do usuário conectado dentro do armazenamento de sessão.
Sessões e cookies estão na internet há muito tempo e funcionam muito bem para a maioria dos aplicativos. Recomendamos usar o guarda de sessão:
- Se você estiver criando um aplicativo da web renderizado pelo servidor.
- Ou uma API AdonisJS com seu cliente no mesmo domínio de nível superior. Por exemplo,
api.example.com
eexample.com
.
Tokens de acesso
Os tokens de acesso são tokens aleatórios criptograficamente seguros (também conhecidos como tokens de acesso opacos) emitidos para usuários após login bem-sucedido. Você pode usar tokens de acesso para aplicativos onde seu servidor AdonisJS não pode gravar/ler cookies. Por exemplo:
- Um aplicativo móvel nativo.
- Um aplicativo da web hospedado em um domínio diferente do seu servidor de API AdonisJS.
Ao usar tokens de acesso, torna-se responsabilidade do seu aplicativo do lado do cliente armazená-los com segurança. Os tokens de acesso fornecem acesso irrestrito ao seu aplicativo (em nome de um usuário), e vazá-los pode levar a problemas de segurança.
Autenticação básica
A proteção de autenticação básica é uma implementação da estrutura de autenticação HTTP, na qual o cliente deve passar as credenciais do usuário como uma string codificada em base64 por meio do cabeçalho Authorization
.
Existem maneiras melhores de implementar um sistema de login seguro do que a autenticação básica. No entanto, você pode usá-lo temporariamente enquanto seu aplicativo estiver em desenvolvimento ativo.
Escolhendo um provedor de usuário
Conforme abordado anteriormente neste guia, um provedor de usuário é responsável por encontrar usuários durante o processo de autenticação.
Os provedores de usuário são específicos de proteção; por exemplo, o provedor de usuário para o guarda de sessão é responsável por encontrar usuários por sua ID, e o provedor de usuário para o guarda de tokens de acesso também é responsável por verificar tokens de acesso.
Nós enviamos com um provedor de usuário Lucid para os guardas integrados, que usa modelos Lucid para encontrar usuários, gerar tokens e verificar tokens.
Instalação
O sistema auth vem pré-configurado com os kits iniciais web
e api
. No entanto, você pode instalá-lo e configurá-lo manualmente dentro de um aplicativo da seguinte forma.
# Configurar com guarda de sessão (padrão)
node ace add @adonisjs/auth --guard=session
# Configurar com guarda de tokens de acesso
node ace add @adonisjs/auth --guard=access_tokens
# Configurar com guarda de autenticação básica
node ace add @adonisjs/auth --guard=basic_auth
Veja as etapas executadas pelo comando add
Instale o pacote
@adonisjs/auth
usando o gerenciador de pacotes detectado.Registra o seguinte provedor de serviços dentro do arquivo
adonisrc.ts
.ts{ providers: [ // ...outros provedores () => import('@adonisjs/auth/auth_provider') ] }
Cria e registra o seguinte middleware dentro do arquivo
start/kernel.ts
.tsrouter.use([ () => import('@adonisjs/auth/initialize_auth_middleware') ])
tsrouter.named({ auth: () => import('#middleware/auth_middleware'), // somente se estiver usando o guarda de sessão guest: () => import('#middleware/guest_middleware') })
Cria o modelo de usuário dentro do diretório
app/models
.Cria migração de banco de dados para a tabela
users
.Cria migrações de banco de dados para o guard selecionado.
O middleware Initialize auth
Durante a configuração, registramos o @adonisjs/auth/initialize_auth_middleware
dentro do seu aplicativo. O middleware é responsável por criar uma instância da classe Authenticator e a compartilha por meio da propriedade ctx.auth
com o restante da solicitação.
Observe que o middleware initialize auth não autentica a solicitação nem protege as rotas. Ele é usado apenas para inicializar o autenticador e compartilhá-lo com o restante da solicitação. Você deve usar o middleware auth para proteger rotas.
Além disso, a mesma instância do autenticador é compartilhada com modelos do Edge (se seu aplicativo estiver usando o Edge), e você pode acessá-la usando a propriedade auth
. Por exemplo:
@if(auth.isAuthenticated)
<p> Hello {{ auth.user.email }} </p>
@end
Criando a tabela de usuários
O comando configure
cria uma migração de banco de dados para a tabela users
dentro do diretório database/migrations
. Sinta-se à vontade para abrir este arquivo e fazer alterações de acordo com os requisitos do seu aplicativo.
Por padrão, as seguintes colunas são criadas.
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'users'
async up() {
this.schema.createTable(this.tableName, (table) => {
table.increments('id').notNullable()
table.string('full_name').nullable()
table.string('email', 254).notNullable().unique()
table.string('password').notNullable()
table.timestamp('created_at').notNullable()
table.timestamp('updated_at').nullable()
})
}
async down() {
this.schema.dropTable(this.tableName)
}
}
Além disso, atualize o modelo User
se você definir, renomear ou remover colunas da tabela users
.
Próximas etapas
- Verificar credenciais do usuário sem comprometer a segurança do seu aplicativo.
- Session guard para autenticação com estado.
- Access tokens guard para autenticação baseada em tokens.