返回

通俗易懂!玩转NestJS:解锁认证与用户信息查询

后端

在 NestJS 中实现用户认证和用户信息查询的完整指南

简介

在构建现代 Web 应用程序时,用户认证和用户信息查询至关重要。NestJS,一个流行的 Node.js 框架,提供了一系列工具,可帮助你轻松有效地实现这些功能。本文将深入探讨如何在 NestJS 中设置认证系统并查询用户信息。

认证

选择认证策略

NestJS 支持多种认证策略,包括 JSON Web Token (JWT) 和 Userinfo。JWT 是一种安全标准,允许你在系统之间安全地传输用户信息。Userinfo 是一种更简单的认证方法,它通过请求发送用户的基本信息。

配置 JWT 认证策略

@Module({
  imports: [
    JwtModule.register({
      secret: 'secretKey',
      signOptions: { expiresIn: '1h' },
    }),
  ],
})
  • secretKey:用于签署和验证 JWT 令牌的密钥。
  • expiresIn:JWT 令牌的过期时间(以小时为单位)。

创建认证控制器

@Controller('auth')
export class AuthController {
  @Post('login')
  login(@Request() req) {
    return this.authService.login(req.user);
  }
}
  • 处理用户登录请求并生成 JWT 令牌。
  • @Request() 装饰器从请求中获取用户数据。

创建认证服务

@Injectable()
export class AuthService {
  login(user) {
    const payload = { username: user.username, sub: user.id };
    return {
      access_token: this.jwtService.sign(payload),
    };
  }
}
  • JwtService 用于生成和验证 JWT 令牌。
  • login() 方法使用 JWT Service 创建并返回 JWT 令牌。

用户信息查询

使用 JWT 访问受保护的路由

@Controller('user')
@UseGuards(AuthGuard('jwt'))
export class UserController {
  @Get()
  findAll() {
    return this.userService.findAll();
  }
}
  • AuthGuard('jwt') 装饰器用于保护路由,仅允许具有有效 JWT 令牌的用户访问。
  • UserService 用于从数据库中检索用户数据。

代码示例

认证模块

// auth.module.ts
@Module({
  imports: [
    JwtModule.register({
      secret: 'secretKey',
      signOptions: { expiresIn: '1h' },
    }),
  ],
  controllers: [AuthController],
  providers: [AuthService],
})
export class AuthModule {}

认证控制器

// auth.controller.ts
@Controller('auth')
export class AuthController {
  @Post('login')
  login(@Request() req) {
    return this.authService.login(req.user);
  }
}

用户信息控制器

// user.controller.ts
@Controller('user')
@UseGuards(AuthGuard('jwt'))
export class UserController {
  @Get()
  findAll() {
    return this.userService.findAll();
  }
}

常见问题解答

1. 如何重置密码?

  • 可以通过添加密码重置端点来实现,该端点允许用户请求重置密码并收到包含重置链接的电子邮件。

2. 如何实现多因素身份验证?

  • NestJS 支持 Google Authenticator 和 TOTP 两种多因素身份验证方法。

3. 如何使用 OAuth2.0 认证?

  • NestJS 与 Passport.js 集成,支持 OAuth2.0 认证。

4. 如何使用社交媒体登录?

  • 可以通过第三方模块,如 passport-google-oauth2,实现社交媒体登录。

5. 如何在 NestJS 中使用会话存储?

  • NestJS 与 Express.js 集成,可以利用会话存储库,例如 connect-mongo。

结论

在 NestJS 中实现用户认证和用户信息查询是一个相对简单的过程。通过使用 JWT 或 Userinfo 认证策略并结合 JWT 访问受保护的路由,你可以构建安全且功能强大的 Web 应用程序。通过回答常见问题解答,本文提供了全面且易于遵循的指南,帮助你完成这个任务。