"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Construire un middleware avec Nextjs

Construire un middleware avec Nextjs

Publié le 2024-08-14
Parcourir:700

Building a middleware with Nextjs

Dans ce court article, j'écrirai sur la façon de créer un middleware avec nextjs.

J'ai récemment construit un service backend complet avec nextjs, et j'ai été vraiment époustouflé par le chemin parcouru par nextjs.

Vous devez avoir des connaissances de base en javascript et nodejs pour suivre cet article.

Pour commencer, vous devez

1. Créez un projet nextjs depuis votre terminal en utilisant la commande ci-dessous

npx create-next-app@latest

Après avoir exécuté cette commande, vous serez invité à configurer votre projet, faites-le.

Après la création du projet,

2. Installez les dépendances nécessaires en exécutant npm install dans votre terminal

Nous n'installerons qu'une seule bibliothèque de packages pour l'authentification, qui est Jose, une alternative aurait pu être jsonwebtoken, mais le middleware nextjs s'exécute sur le navigateur, donc le runtime Edge n'implémente pas un tas de API Node.js

3. Démarrez votre projet en mode développement à l'aide de la commande ci-dessous
npm exécuter dev

4. Créer un fichier middleware.js
Créez un fichier middleware.js à la racine de votre projet, si vous utilisez le répertoire /src, créez le fichier dans le répertoire /src

5. Exporter une fonction middleware depuis le fichier

// /middleware.js

export const middleware = async (req) => {
   try {
   } catch(error){
   console.log(error)
   }
}

6. Extraire le jeton de l'en-tête de la requête

// /middleware.js

import { NextResponse } from 'next/server'

export const middleware = async (req) => {
   try {
    const header = req.headers.get('authorization');
        if(!header) return NextResponse.json({
             status:'error'
             statusCode: 400,
             message:'unauthenticated'
         })

   const token = header.split(" ")[1];
        if(!token) return NextResponse.json({
             status:'error'
             statusCode: 401,
             message:'You are not logged in'
         })
   } catch(error){
   console.log(error)
   }
}

7. Vérifiez le jeton en utilisant jose

// /middleware.js

import { NextResponse } from 'next/server';
import * as jose from 'jose'

export const middleware = async (req) => {
   try {
    const header = req.headers.get('authorization');
        if(!header) return NextResponse.json({
             status:'error'
             statusCode: 400,
             message:'unauthenticated'
         })

   const token = header.split(" ")[1];
        if(!token) return NextResponse.json({
             status:'error'
             statusCode: 401,
             message:'You are not logged in'
         })
    const { payload } = await jose.jwtVerify(
      token,
      new TextEncoder().encode(process.env.NEXT_PUBLIC_JWT_KEY)
    );

// your encoded data will be inside the payload object.

   } catch(error){
   console.log(error)
   }
}

8. Extrayez les données du jeton vérifié et définissez-les dans l'en-tête de la demande

// /middleware.js

import { NextResponse } from 'next/server';
import * as jose from 'jose'

export const middleware = async (req) => {
   try {
    const header = req.headers.get('authorization');
        if(!header) return NextResponse.json({
             status:'error'
             statusCode: 400,
             message:'unauthenticated'
         })

   const token = header.split(" ")[1];
        if(!token) return NextResponse.json({
             status:'error'
             statusCode: 401,
             message:'You are not logged in'
         })
    const { payload } = await jose.jwtVerify(
      token,
      new TextEncoder().encode(process.env.NEXT_PUBLIC_JWT_KEY)
    );

    const requestHeaders = new Headers(req.headers)
    requestHeaders.set('user', payload.id)
   } catch(error){
   console.log(error)
   }
}

9. Appelez la fonction next() et transmettez l'en-tête de requête mis à jour

// /middleware.js

import { NextResponse } from 'next/server';
import * as jose from 'jose'

export const middleware = async (req) => {
   try {
    const header = req.headers.get('authorization');
        if(!header) return NextResponse.json({
             status:'error'
             statusCode: 400,
             message:'unauthenticated'
         })

   const token = header.split(" ")[1];
        if(!token) return NextResponse.json({
             status:'error'
             statusCode: 401,
             message:'You are not logged in'
         })
    const { payload } = await jose.jwtVerify(
      token,
      new TextEncoder().encode(process.env.NEXT_PUBLIC_JWT_KEY)
    );

    const requestHeaders = new Headers(req.headers)
    requestHeaders.set('user', payload.id)

    return NextResponse.next({
               request: {
                headers: requestHeaders
               } 
    })
   } catch(error){
   console.log(error)
   }
}

10. Enfin, vous devez exporter un objet de configuration à partir du fichier middleware qui contient les configurations des routes que vous souhaitez protéger.

// /middleware.js

import { NextResponse } from 'next/server';
import * as jose from 'jose'

export const config = {
  matcher:[
   // contain list of routes you want to protect, e.g /api/users/:path*
]
}

export const middleware = async (req) => {
   try {
    const header = req.headers.get('authorization');
        if(!header) return NextResponse.json({
             status:'error'
             statusCode: 400,
             message:'unauthenticated'
         })

   const token = header.split(" ")[1];
        if(!token) return NextResponse.json({
             status:'error'
             statusCode: 401,
             message:'You are not logged in'
         })
    const { payload } = await jose.jwtVerify(
      token,
      new TextEncoder().encode(process.env.NEXT_PUBLIC_JWT_KEY)
    );

    const requestHeaders = new Headers(req.headers)
    requestHeaders.set('user', payload.id)

    return NextResponse.next({
               request: {
                headers: requestHeaders
               } 
    })
   } catch(error){
   console.log(error)
   }
}

J'espère que ces 10 étapes vous seront utiles, dites-moi ce que vous pensez de cette méthode dans la section commentaires et n'hésitez pas à partager si vous disposez également d'une meilleure façon d'y parvenir.

Merci.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/candie_code/building-a-middleware-with-nextjs-19ii?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3