返回

身份认证的神秘力量:从 0 到 1 构建 NestJS 服务端应用

前端

引言

对于任何服务端应用而言,身份认证都是一道必不可少的防线,它守护着系统的资源分配,确保只有经过授权的用户才能畅行无阻。NestJS,作为一项现代化的 Node.js 框架,为构建安全可靠的服务器端应用程序提供了坚实的基石。在这篇博文中,我们将踏上从 0 到 1 的旅程,深入探索如何使用 NestJS 实现服务端应用的身份认证机制。

1. 身份认证的基础

身份认证,简单来说,就是确认用户的身份。它通常通过收集用户的凭据(如用户名和密码)并将其与存储的记录进行匹配来实现。一旦凭据匹配,用户将被授权访问系统资源。

NestJS 为身份认证提供了开箱即用的支持,它基于 Passport.js 和 JWT(JSON Web 令牌)实现。Passport.js 是一个身份验证中间件,而 JWT 是一种安全、轻量级的令牌,用于在客户端和服务器之间传输用户身份信息。

2. 配置 NestJS 身份认证

首先,我们需要在 NestJS 应用中安装必要的依赖项:

npm install --save @nestjs/jwt passport passport-local

安装完成后,在 app.module.ts 中导入 JwtModule 和 PassportModule:

import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';

@Module({
  imports: [
    JwtModule.register({
      secret: 'secretKey',
      signOptions: { expiresIn: '1d' },
    }),
    PassportModule,
  ],

接下来,创建 LocalStrategy 来处理本地身份认证:

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      usernameField: 'username',
      passwordField: 'password',
    });
  }

  async validate(username: string, password: string): Promise<any> {
    // 这里替换为你的实际用户验证逻辑
    if (username !== 'admin' || password !== 'secret') {
      throw new UnauthorizedException();
    }
    return { username };
  }
}

3. 创建 AuthController

现在,让我们创建一个控制器来处理用户登录请求:

import { Body, Controller, Post, UseGuards } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthDto } from './dto/auth.dto';
import { LocalAuthGuard } from './guards/local-auth.guard';

@Controller('auth')
export class AuthController {
  constructor(private authService: AuthService) {}

  @UseGuards(LocalAuthGuard)
  @Post('login')
  async login(@Body() authDto: AuthDto) {
    return this.authService.login(authDto);
  }
}

在 AuthController 中,login() 方法使用 LocalAuthGuard 保护,这意味着只有通过本地身份认证的用户才能访问此方法。

4. 实现 AuthService

最后,创建一个 AuthService 来处理身份验证逻辑:

import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { AuthDto } from './dto/auth.dto';

@Injectable()
export class AuthService {
  constructor(private jwtService: JwtService) {}

  async login(authDto: AuthDto) {
    const payload = { username: authDto.username };
    return {
      access_token: this.jwtService.sign(payload),
    };
  }
}

5. 结论

通过以上步骤,我们成功地使用 NestJS 实现了一个从 0 到 1 的服务端应用身份认证系统。通过遵循安全实践并使用适当的工具,我们可以确保我们的应用免受未经授权的访问,并为用户提供无缝的安全体验。

拓展阅读

**