Skip to content

Commit

Permalink
Merge pull request #5 from aulasoftwarelibre/auth-chapter-2
Browse files Browse the repository at this point in the history
feat: add extra auth fields
  • Loading branch information
sgomez authored Oct 21, 2023
2 parents ea670d6 + 4f06d3f commit 7cc43c2
Showing 1 changed file with 61 additions and 4 deletions.
65 changes: 61 additions & 4 deletions docs/security-next-auth.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,69 @@ import { Session } from 'next-auth'

import { auth } from '@/lib/next/auth'

export default async function DashboardPage() {
export default async function Page() {
const session: Session | null = await auth()

// Si la variable `session` no es null, podemos conseguir los siguientes datos.
if (session) {
const { user: { email, image, name } = {} } = session
// Podemos ver en la consola de NextJS todos los datos del servidor
console.table(session)

if (!session) {
return <>Unauthorized</>
}

const { user: { name } = {} } = session

return <>Hello, {name}.</>
}
```

## Ampliar datos de la sesión

En ocasiones necesitamos saber más datos provenientes del proveedor de identidad. Uno
de ellos es el `id`, que no viene. Vamos a añadirlo.

Modificamos nuestra configuración:

```ts title="src/app/api/auth/[...nextauth]/route.ts" hl_lines="5-11"
import NextAuth, { NextAuthOptions } from 'next-auth'
import GithubProvider from 'next-auth/providers/github'

export const config: NextAuthOptions = {
callbacks: {
async session({ session, token }) {
session.user.id = token.sub

return session
},
},
providers: [
GithubProvider({
clientId: process.env.GITHUB_ID || '',
clientSecret: process.env.GITHUB_SECRET || '',
}),
],
secret: process.env.NEXTAUTH_SECRET,
}

const handler = NextAuth(config)

export { handler as GET, handler as POST }
```

Estamos añadiendo un campo extra, desgraciadamente ese campo no existe en el interfaz
de usuario original, pero podemos ampliarlo. Esta técnica se llama interface augmention.
Creamos el siguiente fichero:

```ts title="src/types/next-auth.d.ts"
import { DefaultSession } from 'next-auth'

declare module 'next-auth' {
interface Session {
user: {
id?: string | null
} & DefaultSession['user']
}
}
```

Y ya el interprete de Typescript debe dejar de dar error porque el campo id no existe.

0 comments on commit 7cc43c2

Please sign in to comment.