Maison > interface Web > js tutoriel > Construire un middleware avec Nextjs

Construire un middleware avec Nextjs

PHPz
Libérer: 2024-08-13 07:00:02
original
1149 Les gens l'ont consulté

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
Copier après la connexion

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

Après avoir créé le projet,

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

Nous allons installer 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éez 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)
   }
}

Copier après la connexion

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

// /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)
   }
}

Copier après la connexion

7. Vérifiez le jeton en utilisant José

// /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)
   }
}

Copier après la connexion

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)
   }
}

Copier après la connexion

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)
   }
}

Copier après la connexion

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)
   }
}

Copier après la connexion

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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal