# O que é o Lucia Auth?

Por
Pedro Amorim de Gregori
Em 
Publicado 2024-04-10

O Lucia Auth é uma biblioteca de autorização que fornece abstrações do manuseio de sessões, como criação e invalidação de sessão. Ela apresenta suporte tanto para autenticação de terceiros (OAuth) quanto para autenticação por credenciais.

# Instalação

A instalação do Lucia pode ser feito utilizando o gerenciador de pacotes do projeto. O hash das senhas será feito utilizando a biblioteca bcrypt que é uma biblioteca de criptografia. O bcrypt só é necessário para autenticação por credenciais.

pnpm install lucia bcrypt
pnpm install --save @types/bcrypt

# Inicialização

Será necessário a escolha de um adaptador para abstrair o contato do Lucia com o banco de dados ou ORM. Como na empresa utilizamos a ORM prisma para lidar com o banco de dados, aqui também será utilizado.

pnpm install @lucia-auth/adapter-prisma

Para utilizarmos o adaptador do prisma será necessário realizar o setup do prisma. É Recomendado a leitura da documentação do prisma. O lucia requer as models user e session com alguns campos predefinidos no schema.prisma.

schema.prisma
//...
model User {
  id       String    @id @default(cuid()) // O id pode ser numerico sequencial ou usar uuid se quiser
  sessions Session[]
}

model Session {
  id        String   @id
  expiresAt DateTime
  user      User     @relation(references: [id], fields: [userId], onDelete: Cascade)
//...
}

Após configuração da ORM, pode-se realizar a configuração do lucia. Para isso, poderá ser utilizado o seguinte código:

auth/lucia.ts
import { Lucia } from "lucia";
import { PrismaClient } from "@prisma/client";
import { PrismaAdapter } from "@lucia-auth/adapter-prisma";

const client = new PrismaClient();
const adapter = new PrismaAdapter(client.session, client.user);

// Lucia é uma classe que implementa funções úteis para autenticação como criar sessões ou validá-las.
// Instância global do lucia para evitar repetições.

export const lucia = new Lucia(adapter, {
	sessionCookie: {
		attributes: {
			secure: process.env.NODE_ENV === "production",
		},
	},
});

declare module "lucia" {
	interface Register {
		Lucia: typeof lucia;
	}
}