nestjs 实现用户注册、登录和验证功能
时间: 2023-10-05 09:09:10 浏览: 176
NestJS 是一个非常强大的后端框架,它提供了许多工具和库来帮助我们实现用户注册、登录和验证功能。下面是一个基本的 NestJS 用户注册、登录和验证功能的实现步骤:
1. 安装必要的库
首先,我们需要安装一些必要的库:
```bash
npm install @nestjs/passport passport passport-local bcryptjs jsonwebtoken
```
这些库将帮助我们实现身份验证和密码加密。
2. 创建用户模型
我们需要创建一个用户模型,用于存储用户的用户名和密码。在 NestJS 中,我们可以使用 Mongoose 来定义和操作 MongoDB 数据库。
```bash
nest g class users/user
```
```typescript
import * as mongoose from 'mongoose';
export const UserSchema = new mongoose.Schema({
username: String,
password: String,
});
export interface User extends mongoose.Document {
id: string;
username: string;
password: string;
}
```
3. 创建用户服务
我们需要创建一个用户服务,用于处理用户注册、登录和验证逻辑。
```bash
nest g service users/user
```
```typescript
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { User } from './user.interface';
import * as bcrypt from 'bcryptjs';
@Injectable()
export class UserService {
constructor(@InjectModel('User') private readonly userModel: Model<User>) {}
async findByUsername(username: string): Promise<User | undefined> {
return await this.userModel.findOne({ username }).exec();
}
async create(user: User): Promise<User> {
const salt = bcrypt.genSaltSync();
user.password = bcrypt.hashSync(user.password, salt);
const newUser = new this.userModel(user);
return await newUser.save();
}
async comparePassword(password: string, hash: string): Promise<boolean> {
return bcrypt.compareSync(password, hash);
}
}
```
4. 创建身份验证策略
我们需要创建一个身份验证策略,用于验证用户的用户名和密码。在 NestJS 中,我们可以使用 Passport.js 来实现身份验证。
```bash
nest g guard auth/auth
```
```typescript
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class AuthGuardLocal extends AuthGuard('local') {}
```
5. 创建身份验证模块
我们需要创建一个身份验证模块,用于注册身份验证策略和提供身份验证服务。在 NestJS 中,我们可以使用 Passport.js 和 JWT 来实现身份验证。
```bash
nest g module auth
```
```typescript
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { UserService } from '../users/user.service';
import { UserSchema } from '../users/user.model';
import { JwtStrategy } from './jwt.strategy';
import { LocalStrategy } from './local.strategy';
@Module({
imports: [
MongooseModule.forFeature([{ name: 'User', schema: UserSchema }]),
PassportModule,
JwtModule.register({
secret: 'secret',
signOptions: { expiresIn: '1d' },
}),
],
providers: [AuthService, UserService, LocalStrategy, JwtStrategy],
controllers: [AuthController],
})
export class AuthModule {}
```
6. 创建身份验证控制器
我们需要创建一个身份验证控制器,用于处理用户注册、登录和验证请求。
```bash
nest g controller auth
```
```typescript
import {
Controller,
Post,
UseGuards,
Request,
Body,
Get,
} from '@nestjs/common';
import { AuthGuardLocal } from './auth.guard';
import { AuthService } from './auth.service';
import { UserService } from '../users/user.service';
import { User } from '../users/user.interface';
import { JwtAuthGuard } from './jwt.guard';
@Controller()
export class AuthController {
constructor(
private authService: AuthService,
private userService: UserService,
) {}
@UseGuards(AuthGuardLocal)
@Post('auth/login')
async login(@Request() req) {
return this.authService.login(req.user);
}
@Post('auth/register')
async register(@Body() user: User) {
return this.userService.create(user);
}
@UseGuards(JwtAuthGuard)
@Get('profile')
async getProfile(@Request() req) {
return req.user;
}
}
```
7. 创建身份验证策略
我们需要创建一个身份验证策略,用于验证用户的 JWT token。在 NestJS 中,我们可以使用 Passport.js 和 JWT 来实现身份验证。
```bash
nest g guard auth/jwt
```
```typescript
import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}
```
8. 创建身份验证策略
我们需要创建一个身份验证策略,用于验证用户的用户名和密码。在 NestJS 中,我们可以使用 Passport.js 来实现身份验证。
```bash
nest g guard auth/local
```
```typescript
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';
import { AuthService } from './auth.service';
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor(private authService: AuthService) {
super();
}
async validate(username: string, password: string): Promise<any> {
const user = await this.authService.validateUser(username, password);
if (!user) {
return false;
}
return user;
}
}
```
9. 创建 JWT 策略
我们需要创建一个 JWT 策略,用于验证用户的 JWT token。在 NestJS 中,我们可以使用 Passport.js 和 JWT 来实现身份验证。
```typescript
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { UserService } from '../users/user.service';
import { User } from '../users/user.interface';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private readonly userService: UserService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'secret',
});
}
async validate(payload: any): Promise<User> {
return await this.userService.findByUsername(payload.username);
}
}
```
现在我们已经完成了 NestJS 用户注册、登录和验证功能的实现。我们可以通过发送 POST 请求到 `/auth/register` 端点来注册新用户,通过发送 POST 请求到 `/auth/login` 端点来登录,通过发送 GET 请求到 `/profile` 端点来获取用户信息。
阅读全文