Integrações

Auth.js (NextAuth)

O login por e-mail (magic link) do Auth.js enviado pela API da Postal.

No Auth.js (NextAuth), o login por e-mail (magic link) usa um provedor de e-mail. Este provedor envia pela API da Postal. Não há conexão para criar.

#Chave e remetente

Crie uma chave só de envio em Chaves de API, guarde em POSTAL_API_KEY e use um remetente de um domínio verificado.

#O provedor

auth.ts
import NextAuth from 'next-auth'
import type { EmailConfig } from 'next-auth/providers'

const Postal: EmailConfig = {
  id: 'postal',
  type: 'email',
  name: 'E-mail',
  from: 'Minha empresa <[email protected]>',
  maxAge: 24 * 60 * 60,
  options: {},
  async sendVerificationRequest({ identifier, url, provider }) {
    const response = await fetch('https://api.postal.so/emails', {
      method: 'POST',
      headers: { Authorization: `Bearer ${process.env.POSTAL_API_KEY}`, 'Content-Type': 'application/json' },
      body: JSON.stringify({
        from: provider.from,
        to: [identifier],
        subject: 'Seu link de acesso',
        html: `<p><a href="${url}">Entrar</a></p><p>O link vale por 24 horas.</p>`,
        text: `Entre pelo link: ${url}`,
      }),
    })

    if (!response.ok) {
      throw new Error(`Postal respondeu ${response.status}`)
    }
  },
}

export const { handlers, auth, signIn, signOut } = NextAuth({
  // O login por e-mail precisa de um adapter de banco (Prisma, Drizzle...).
  // adapter: PrismaAdapter(prisma),
  providers: [Postal],
})

Os links de verificação são guardados pelo adapter. Para usar um template da Postal, troque html e text por template: { id, variables: { URL: url } }.