-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4 from aulasoftwarelibre/auth-chapter
Auth chapter
- Loading branch information
Showing
6 changed files
with
178 additions
and
34 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
|
||
NextAuth.js es una librería de autenticación que se integra fácilmente con aplicaciones web basadas en Next.js. Esta potente librería simplifica la implementación de la autenticación de usuarios, incluyendo la autenticación social y el manejo de sesiones. Con NextAuth.js, puedes configurar la autenticación de manera eficiente y segura, permitiendo a los usuarios acceder a tus aplicaciones de forma sencilla a través de múltiples proveedores, como Google, Facebook, GitHub y más. | ||
|
||
## Instalación | ||
|
||
Lo primero es instalar el paquete, como siempre: | ||
|
||
```bash | ||
npm install next-auth | ||
``` | ||
|
||
Y a continuación creamos el fichero de configuración: | ||
|
||
```ts title="src/app/api/auth/[...nextauth]/route.ts" | ||
import NextAuth, { NextAuthOptions } from 'next-auth' | ||
import GithubProvider from 'next-auth/providers/github' | ||
|
||
export const config: NextAuthOptions = { | ||
providers: [ | ||
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 } | ||
``` | ||
|
||
Y activamos el middleware que se encarga de garantizar que todas las llamadas a Next | ||
son seguras: | ||
|
||
```ts title="src/middleware.ts" | ||
export { default } from 'next-auth/middleware' | ||
|
||
export const config = { matcher: ['/counter'] } | ||
``` | ||
|
||
!!! info | ||
Por defecto el middleware asegura todas los accesos. Con `matcher` podemos restringir | ||
qué rutas queremos proteger. Para este ejemplo solo vamos a asegurar nuestro contador. | ||
|
||
Mira la documentación de [middleware en next](https://nextjs.org/docs/app/building-your-application/routing/middleware) para saber como funciona `matcher`. | ||
|
||
|
||
En este fichero registraremos que proveedores de identidad queremos usar, en el | ||
ejemplo usaremos GitHub, pero podemos usar muchísimos mas (Google, Spotify, Twitter,...). | ||
|
||
Ahora necesitamos poder leer la sesión del usuario cuando esta logueado. NextAuth | ||
nos da una función, pero como requiere pasarle un parámetro vamos a crear una propia | ||
que nos ahorre trabajo cada vez que la queremos usar: | ||
|
||
```ts title="src/lib/next/auth.ts" | ||
import type { | ||
GetServerSidePropsContext, | ||
NextApiRequest, | ||
NextApiResponse, | ||
} from 'next' | ||
import { getServerSession } from 'next-auth' | ||
|
||
import { config } from '@/app/api/auth/[...nextauth]/route' | ||
|
||
export function auth( | ||
...args: | ||
| [GetServerSidePropsContext['req'], GetServerSidePropsContext['res']] | ||
| [NextApiRequest, NextApiResponse] | ||
| [] | ||
) { | ||
return getServerSession(...args, config) | ||
} | ||
``` | ||
|
||
## Registro de nuestra aplicación en Github | ||
|
||
Para que podamos hacer login usando Github, necesitamos registrar una aplicación | ||
OAuth. Para ello nos iremos a la web de registro de aplicaciones OAuth: | ||
[https://github.com/settings/applications/new](https://github.com/settings/applications/new) | ||
|
||
Necesitamos tres datos: | ||
|
||
* **Application name**: El que queramos, por ejemplo: `Curso de NextJS del Aula de Software Libre` | ||
* **Homepage URL**: Esta sería la url de nuestra web si estuviera publicada, por ahora usaremos: `http://localhost:3000/` | ||
* **Authorization callback URL**: Esta es la url de NextAuth que finalizará el proceso de autenticación, debemos poner: `http://localhost:3000/api/auth/callback/github` | ||
|
||
![Registro de aplicación OAuth en Github](images/github-oauth-registry.png) | ||
|
||
|
||
Una vez eso ya tendremos el primero de los dos datos que necesitamos el `GITHUB_ID`, es la cadena hexadecimal que | ||
aparece en la web de la aplicación. A continuación debemos pulsar a `Generate a new client secret` para | ||
conseguir el segundo dato necesario `GITHUB_SECRET` | ||
|
||
|
||
![Credenciales de aplicación OAuth en Github](images/github-oauth-credentials.png) | ||
|
||
Y por último vamos a crear un archivo de credenciales donde guardar esos datos: | ||
|
||
```env title=".env.local" | ||
GITHUB_ID=tu Client ID de la web de Github | ||
GITHUB_SECRET=tu Client Secret de la web de Github | ||
NEXTAUTH_URL=http://localhost:3000/api/auth | ||
NEXTAUTH_SECRET=CHANGE_ME | ||
``` | ||
|
||
!!! info | ||
Recuerda que las credenciales son secretas, nunca las subas a Github. | ||
El fichero `.env.local` está en el `.gitignore` así que no tienes que preocuparte. | ||
|
||
## Acceso a la web asegurara | ||
|
||
Si intentamos acceder ahora a nuestro contador, veremos que nos saltará la página | ||
para loguearnos en Github. Solo si nos identificamos podremos verla. | ||
|
||
Para conseguir ver los datos del usuario es tan facil como hacer lo siguiente en cualquier | ||
lugar donde lo necesitemos: | ||
|
||
```ts | ||
import { Session } from 'next-auth' | ||
|
||
import { auth } from '@/lib/next/auth' | ||
|
||
export default async function DashboardPage() { | ||
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 | ||
} | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
La seguridad en aplicaciones web es esencial para proteger la información confidencial y garantizar la privacidad de los usuarios. Al trabajar con Next.js y React, es fundamental tener en cuenta aspectos clave de seguridad, como el manejo de cookies y tokens JWT. | ||
|
||
## Cookies | ||
|
||
Las cookies son pequeños archivos de texto que se almacenan en el navegador del usuario. En el contexto de aplicaciones web, las cookies se utilizan para almacenar información, como sesiones de usuario. En el caso de Next.js y React, las cookies pueden ser empleadas para gestionar la autenticación y la autorización de usuarios. Es importante asegurarse de que las cookies se utilicen de manera segura y se protejan contra ataques como la manipulación de cookies o el acceso no autorizado. | ||
|
||
## Tokens JWT (JSON Web Tokens) | ||
|
||
Los tokens JWT son una forma común de autenticación y autorización en aplicaciones web. Estos tokens son emitidos por un servidor de autenticación y contienen información codificada, como los roles del usuario o la fecha de expiración. En una aplicación Next.js y React, los tokens JWT se pueden utilizar para verificar la identidad de los usuarios y permitirles acceder a recursos protegidos. Es crucial implementar prácticas sólidas para la generación, gestión y validación de tokens JWT, además de asegurarse de que se transmitan de manera segura entre el cliente y el servidor. | ||
|
||
Mantener un enfoque en la seguridad de las aplicaciones es fundamental para garantizar la confidencialidad y la integridad de los datos. Tanto el uso de cookies como de tokens JWT son herramientas esenciales en la construcción de aplicaciones seguras con Next.js y React. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.