npm package: @irondome/auth
Description: Authentication + Session adapters for Irondome
Latest version: 0.1.3

# @irondome/auth

> **Autenticação** e **identidade** — bcrypt, JWT e adapters para o mesmo `Subject` que o PBAC consome.

**Pilar:** *quem é o utilizador?* Produz tokens e mapeia sessões externas para **`Subject`** (`@irondome/core`).

Parte do monorepo **[Irondome](../../README.md)** — alinhado ao [README principal](../../README.md): auth próprio, NextAuth e Clerk.

---

## O que é?

`@irondome/auth` fornece **login email/senha** (`bcrypt` + `jose`), **`createOwnAuth`**, verificação de **JWT**, subpath **`@irondome/auth/jwt`** só com `jose` (Edge/middleware), **adapters** `nextAuthToSubject` e `clerkToSubject`, e **schema Drizzle** PostgreSQL (`irondome_users`).

**Autenticação ≠ autorização** — as regras ficam em `@irondome/core` + `@irondome/next`.

---

## Instalação

```bash
pnpm add @irondome/auth @irondome/core
```

---

## Dependências

| Tipo | Pacotes |
|------|---------|
| **Peer** | `@irondome/core` (obrigatório), `drizzle-orm` (opcional — só para schema PG) |
| **Incluídos** | `bcryptjs`, `jose` |

---

## O que inclui

| Área | Conteúdo |
|------|----------|
| Auth próprio | `createOwnAuth`, `signIn`, `getSubjectFromToken`, `hashPassword`, `verifyPassword` |
| JWT (Edge) | `import { verifyToken } from "@irondome/auth/jwt"` — sem bcrypt |
| NextAuth | `nextAuthToSubject` |
| Clerk | `clerkToSubject` |
| Utilitário | `toSubject` |
| Schema | `@irondome/auth/schema/pg` → `irondomeUsers` |

---

## Exemplo rápido (auth próprio)

```ts
import { createOwnAuth } from "@irondome/auth";
import { db } from "@/server/db";
import { irondomeUsers } from "@irondome/auth/schema/pg";
import { eq } from "drizzle-orm";

export const ownAuth = createOwnAuth({
  jwtSecret: process.env.JWT_SECRET!,
  getUserByEmail: (email) =>
    db.query.irondomeUsers.findFirst({ where: eq(irondomeUsers.email, email) }),
});
```

```ts
// app/api/auth/signin/route.ts
import { ownAuth } from "@/lib/irondome/own-auth";
import { NextResponse } from "next/server";

export async function POST(req: Request) {
  const { email, password } = await req.json();
  const result = await ownAuth.signIn(email, password);
  if (!result.ok) return NextResponse.json({ error: "Credenciais inválidas" }, { status: 401 });

  const res = NextResponse.json({ ok: true });
  res.cookies.set(ownAuth.cookieName, result.token, { httpOnly: true, sameSite: "lax" });
  return res;
}
```

*(Mesmo fluxo descrito no [README do monorepo](../../README.md), secção Auth próprio.)*

---

## Middleware (Edge) — só JWT

```ts
import { verifyToken } from "@irondome/auth/jwt";

const payload = await verifyToken(token, process.env.JWT_SECRET!);
// Subject: { id: payload.sub, roles: payload.roles, orgId: payload.orgId }
```

Não importes `bcrypt` no Edge.

---

## Adapters (NextAuth / Clerk)

```ts
import { nextAuthToSubject } from "@irondome/auth";
const subject = nextAuthToSubject(session, { getRoles: (s) => s.user?.roles ?? ["user"] });

import { clerkToSubject } from "@irondome/auth";
const subject = clerkToSubject(await auth());
```

---

## Relação com outros pacotes

| Pacote | Função |
|--------|--------|
| `@irondome/core` | Avalia `can(subject, …)` — precisa do `Subject` que este pacote fornece |
| `@irondome/next` | Lê cookies / chama `verifyToken` no middleware e expõe guards |

---

## Variáveis de ambiente

```env
JWT_SECRET=mínimo-32-chars-aleatórios
DATABASE_URL=postgresql://...   # se usares Drizzle + schema PG
```

---

## Documentação

| Recurso | Ligação |
|---------|---------|
| Monorepo | [README Irondome](../../README.md) |
| Quatro pilares (Auth) | [Guia dos pilares](../../docs/guia-dos-pilares.md) |
| Publicar no npm | [npm-publish](../../docs/npm-publish.md) |

---

## Licença

MIT © rbxyz