Skip to content

Proteção de autenticação básica

O auth guard básico é 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. O servidor permite a solicitação se as credenciais forem válidas. Caso contrário, um prompt nativo da Web é exibido para inserir novamente as credenciais.

Configurando o guard

Os guards de autenticação são definidos dentro do arquivo config/auth.ts. Você pode configurar vários guards dentro deste arquivo sob o objeto guards.

ts
import { defineConfig } from '@adonisjs/auth'
import { basicAuthGuard, basicAuthUserProvider } from '@adonisjs/auth/basic_auth'

const authConfig = defineConfig({
  default: 'basicAuth',
  guards: {
    basicAuth: basicAuthGuard({
      provider: basicAuthUserProvider({
        model: () => import('#models/user'),
      }),
    })
  },
})

export default authConfig

O método basicAuthGuard cria uma instância da classe BasicAuthGuard. Ele aceita um provedor de usuário que pode ser usado para encontrar usuários durante a autenticação.

O método basicAuthUserProvider cria uma instância da classe BasicAuthLucidUserProvider. Ele aceita uma referência ao modelo a ser usado para verificar as credenciais do usuário.

Preparando o modelo User

O modelo (modelo User neste exemplo) configurado com o basicAuthUserProvider deve usar o mixin AuthFinder para verificar as credenciais do usuário durante a autenticação.

ts
import { DateTime } from 'luxon'
import { compose } from '@adonisjs/core/helpers'
import { BaseModel, column } from '@adonisjs/lucid/orm'
import hash from '@adonisjs/core/services/hash'
import { withAuthFinder } from '@adonisjs/auth/mixins/lucid'

const AuthFinder = withAuthFinder(() => hash.use('scrypt'), {
  uids: ['email'],
  passwordColumnName: 'password',
})

export default class User extends compose(BaseModel, AuthFinder) {
  @column({ isPrimary: true })
  declare id: number

  @column()
  declare fullName: string | null

  @column()
  declare email: string

  @column()
  declare password: string

  @column.dateTime({ autoCreate: true })
  declare createdAt: DateTime

  @column.dateTime({ autoCreate: true, autoUpdate: true })
  declare updatedAt: DateTime
}

Protegendo rotas

Depois de configurar o guard, você pode usar o middleware auth para proteger rotas de solicitações não autenticadas. O middleware é registrado dentro do arquivo start/kernel.ts sob a coleção de middleware nomeada.

ts
import router from '@adonisjs/core/services/router'

export const middleware = router.named({
  auth: () => import('#middleware/auth_middleware')
})
ts
import { middleware } from '#start/kernel'
import router from '@adonisjs/core/services/router'

router
  .get('dashboard', ({ auth }) => {
    return auth.user
  })
  .use(middleware.auth({
    guards: ['basicAuth']
  }))

Lidando com exceção de autenticação

O middleware auth lança o E_UNAUTHORIZED_ACCESS se o usuário não for autenticado. A exceção é automaticamente convertida em uma resposta HTTP com o cabeçalho WWW-Authenticate na resposta. O WWW-Authenticate desafia a autenticação e aciona um prompt nativo da web para inserir novamente as credenciais.

Obtendo acesso ao usuário autenticado

Você pode acessar a instância do usuário conectado usando a propriedade auth.user. Como você está usando o middleware auth, a propriedade auth.user estará sempre disponível.

ts
import { middleware } from '#start/kernel'
import router from '@adonisjs/core/services/router'

router
  .get('dashboard', ({ auth }) => {
    return `You are authenticated as ${auth.user!.email}`
  })
  .use(middleware.auth({
    guards: ['basicAuth']
  }))

Obter usuário autenticado ou falhar

Se você não gosta de usar o operador de asserção não nulo na propriedade auth.user, você pode usar o método auth.getUserOrFail. Este método retornará o objeto do usuário ou lançará a exceção E_UNAUTHORIZED_ACCESS.

ts
import { middleware } from '#start/kernel'
import router from '@adonisjs/core/services/router'

router
  .get('dashboard', ({ auth }) => {
    const user = auth.getUserOrFail()
    return `You are authenticated as ${user.email}`
  })
  .use(middleware.auth({
    guards: ['basicAuth']
  }))