在NestJS中使用基本身份验证,可以通过创建一个自定义中间件来实现。以下是一个简单的示例,演示如何在NestJS中使用基本身份验证:
nest new nestjs-basic-auth-example
cd nestjs-basic-auth-example
@nestjs/platform-express
模块,因为我们将使用Express作为底层HTTP平台:npm install --save @nestjs/platform-express
basic-auth.middleware.ts
的新文件,用于实现基本身份验证中间件:// basic-auth.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class BasicAuthMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.status(401).send('Authentication header missing');
}
const [authType, credentials] = authHeader.split(' ');
if (authType.toLowerCase() !== 'basic') {
return res.status(400).send('Invalid authentication type');
}
const [username, password] = Buffer.from(credentials, 'base64').toString().split(':');
if (username !== 'admin' || password !== 'password') {
return res.status(401).send('Invalid username or password');
}
next();
}
}
在这个中间件中,我们检查请求头中的Authorization
字段。如果没有提供,或者认证类型不是Basic
,则返回相应的错误状态码。然后,我们解码Base64编码的凭据,并检查用户名和密码是否有效。在这个示例中,我们只接受用户名为admin
且密码为password
的有效凭据。
app.module.ts
中导入BasicAuthMiddleware
:// app.module.ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { BasicAuthMiddleware } from './basic-auth.middleware';
@Module({
imports: [],
controllers: [],
providers: [],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(BasicAuthMiddleware)
.forRoutes('*');
}
}
在这里,我们实现了NestModule
接口,并在configure
方法中使用MiddlewareConsumer
配置中间件。我们将BasicAuthMiddleware
应用于所有路由。
app.controller.ts
的新文件,用于测试基本身份验证:// app.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller()
export class AppController {
@Get()
getHello(): string {
return 'Hello, you are authenticated!';
}
}
app.module.ts
以包含新创建的控制器:// app.module.ts
import { Module } from '@nestjs/common';
import { ExpressAdapter } from '@nestjs/platform-express';
import { AppController } from './app.controller';
import { BasicAuthMiddleware } from './basic-auth.middleware';
@Module({
imports: [],
controllers: [AppController],
providers: [],
})
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(BasicAuthMiddleware)
.forRoutes('*');
}
}
main.ts
以使用ExpressAdapter
:// main.ts
import { NestFactory } from '@nestjs/core';
import { ExpressAdapter } from '@nestjs/platform-express';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule, new ExpressAdapter());
await app.listen(3000);
}
bootstrap();
现在,当你尝试访问http://localhost:3000
时,浏览器会提示你输入用户名和密码。只有在提供了有效的凭据(在这个示例中是admin
用户名和password
密码)后,你才能看到“Hello, you are authenticated!”的消息。
领取专属 10元无门槛券
手把手带您无忧上云