Penghias dan perisian tengah ialah roti dan mentega NestJS—alat yang boleh menjadikan hidup anda sama ada sangat mudah atau sedikit menggembirakan, bergantung pada cara anda mendekatinya.
Hari ini, mari kita membuat penghias tersuai dan perisian tengah untuk pengesahan pengguna, sambil memastikan perkara itu ringan dan mudah. Dapatkan kopi anda, dan mari selami!
Pertama, mari kita tentukan antara muka untuk objek pengguna kita.
Ini akan memastikan keselamatan taip dan memastikan IDE kami gembira (dan siapa yang tidak suka IDE gembira?).
export interface IUser { id: string; name: string; primaryEmail: string; phoneNumber: string | null; countryCode: string | null; dob: Date | null; createdAt: Date; updatedAt?: Date; deletedAt?: Date | null; }
Penghias tersuai adalah seperti kanak-kanak yang hebat dalam aplikasi NestJS.
Di sini, kami membuat satu untuk mengambil metadata pengguna daripada objek permintaan.
import { createParamDecorator, ExecutionContext } from '@nestjs/common'; import { IUser } from '../interface/user.interface'; export const UserMetadata = createParamDecorator( (_data: unknown, ctx: ExecutionContext) => { const request = ctx.switchToHttp().getRequest(); return request.user as IUser; }, );
Itu sahaja! Penghias ini kini boleh digunakan untuk menarik maklumat pengguna terus dalam kaedah pengawal anda.
Sekarang, mari buat AuthGuard untuk melindungi titik akhir kita seperti bouncer maya.
import { CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { verify } from 'jsonwebtoken'; import { Observable } from 'rxjs'; import { IS_PUBLIC_KEY } from '../constant/core'; import { IUser } from '../interface/user.interface'; @Injectable() export class AuthGuard implements CanActivate { constructor( private reflector: Reflector, ) { } canActivate( context: ExecutionContext, ): boolean | Promise<boolean> | Observable<boolean> { const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [ context.getHandler(), context.getClass(), ]); if (isPublic) { return true; } const request = context.switchToHttp().getRequest(); const headers = request.headers; const token = (headers['authorization'] || '').split(' ')[1]; if (!token) { throw new ForbiddenException('Not Authenticated'); } const jwtOpts = { expiresIn: '1h', // Replace with env vars in real use audience: 'your-audience', algorithm: 'HS256', issuer: 'your-issuer', }; try { const decoded = verify(token, "my-jwt-secret-token", { audience: jwtOpts.audience, issuer: jwtOpts.issuer, }) as { user: IUser }; request.user = decoded.user; return true; } catch (err) { throw new ForbiddenException('Session Expired or Invalid'); } } }
Sesetengah laluan harus terbuka (seperti log masuk), dan beberapa laluan mungkin dalaman.
Mari tambah dua penghias ringkas untuk itu.
import { SetMetadata } from '@nestjs/common'; export const IS_PUBLIC_KEY = 'isPublic'; export const IS_INTERNAL = 'isInternal'; export const Public = () => SetMetadata(IS_PUBLIC_KEY, true); export const Internal = () => SetMetadata(IS_INTERNAL, true);
Akhir sekali, berikut ialah cara anda boleh menggunakan semua ini dalam pengawal anda.
import { Controller, Get, UseGuards } from '@nestjs/common'; import { UserMetadata } from '../decorators/user.decorator'; import { AuthGuard } from '../guards/auth.guard'; import { Public } from '../decorators/public.decorator'; @Controller('users') export class UserController { @Public() @Get('login') login() { return { message: 'Login endpoint (public)' }; } @UseGuards(AuthGuard) @Get('profile') getProfile(@UserMetadata() user: IUser) { return { message: 'User Profile', user, }; } }
Dan begitulah! Anda telah mencipta penghias tersuai, perisian tengah dan penghias metadata untuk mengurus laluan awam.
Menggunakan alatan ini, anda boleh membina API yang selamat dan teratur dalam NestJS.
Jika ini terasa terlalu berat, ingat—malah Rom tidak dibina dalam sehari, tetapi API anda pasti boleh meningkat dengan lebih pantas!
Jangan ragu untuk mengubah suai dan bereksperimen dengan coretan ini.
Langit adalah had dengan NestJS! ?
Saya telah mengusahakan alat yang sangat mudah yang dipanggil LiveAPI.
Ia direka untuk menjadikan dokumentasi API mudah untuk pembangun.
Dengan LiveAPI, anda boleh menjana dokumentasi API interaktif dengan cepat yang membolehkan pengguna melaksanakan API terus daripada penyemak imbas.
Jika anda bosan membuat dokumen secara manual untuk API anda, alat ini mungkin menjadikan hidup anda lebih mudah.
Atas ialah kandungan terperinci Cara Membuat dan Menggunakan Penghias dan Middleware dalam NestJS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!