Nodejs Nestjs Passport Local插件passport-local的使用
Nodejs Nestjs Passport Local插件passport-local的使用
在NestJS中使用passport-local
进行本地认证(即用户名和密码)是一个常见的需求。下面我会一步步指导你如何设置这个功能。
1. 安装必要的依赖
首先,你需要安装@nestjs/passport
, passport
, passport-local
, 和 @nestjs/jwt
(如果你需要JWT支持的话)。
npm install @nestjs/passport passport passport-local @nestjs/jwt
2. 配置Passport模块
在你的应用程序中创建一个模块来配置Passport。通常情况下,这会在你的AuthModule
中完成。
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { LocalStrategy } from './local.strategy';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'local' }),
],
providers: [AuthService, LocalStrategy],
controllers: [AuthController],
})
export class AuthModule {}
3. 创建LocalStrategy
接下来,创建一个策略类LocalStrategy
,它将处理实际的登录逻辑。
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';
@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) {
throw new UnauthorizedException();
}
return user;
}
}
在这个例子中,validate
方法接收用户名和密码,并返回用户信息。如果没有找到匹配的用户,则抛出一个错误。
4. 创建AuthService
AuthService
负责验证用户信息。这里你可以连接数据库或使用其他方式验证用户。
import { Injectable } from '@nestjs/common';
import { UsersService } from '../users/users.service';
@Injectable()
export class AuthService {
constructor(private usersService: UsersService) {}
async validateUser(username: string, pass: string): Promise<any> {
const user = await this.usersService.findOne(username);
if (user && user.password === pass) {
const { password, ...result } = user;
return result;
}
return null;
}
}
注意:这里的密码比较只是示例,生产环境中你应该使用安全的方式存储和比较密码,比如bcrypt。
5. 创建AuthController
最后,创建一个控制器来处理登录请求。
import { Controller, Post, Body, HttpException, HttpStatus } from '@nestjs/common';
import { AuthService } from './auth.service';
import { LoginDto } from './dto/login.dto';
@Controller('auth')
export class AuthController {
constructor(private readonly authService: AuthService) {}
@Post('login')
async login(@Body() loginDto: LoginDto) {
const user = await this.authService.validateUser(loginDto.username, loginDto.password);
if (!user) {
throw new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED);
}
return this.authService.login(user);
}
}
6. 创建DTO(可选)
为了类型检查和验证输入,你可以创建一个LoginDto
。
import { IsString, Length, Matches } from 'class-validator';
export class LoginDto {
@IsString()
@Length(4, 20)
username: string;
@IsString()
@Length(6, 20)
password: string;
}
以上步骤应该能帮助你在NestJS项目中实现基本的本地认证。请确保在实际部署前对密码进行安全处理。
当然,没问题!想象一下,你正在做一个美味的披萨,但你需要确保只有拥有正确密码(也就是正确的披萨酱配方)的人才能享用。这时候,Passport Local
就是你的守护神,它帮助你验证披萨的秘密配方。
首先,你需要安装passport
和passport-local
:
npm install passport passport-local
然后,在你的NestJS项目中,设置PassportModule
并配置LocalStrategy
。这就像告诉披萨店,只有知道正确配方的人才能得到披萨。
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './local.strategy';
@Module({
imports: [PassportModule.register({ defaultStrategy: 'local' })],
providers: [LocalStrategy],
})
export class AuthModule {}
接下来,创建一个策略文件local.strategy.ts
,定义如何验证用户身份:
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();
}
async validate(username: string, password: string): Promise<any> {
// 这里应该调用你的服务来验证用户名和密码
if (username === 'admin' && password === '1234') {
return { userId: 123, username: 'admin' };
}
throw new UnauthorizedException();
}
}
现在,你可以开始使用这个策略来保护你的API端点了。比如,你可以创建一个控制器来处理登录请求:
import { Controller, Post, Body } from '@nestjs/common';
import { AuthService } from './auth.service';
@Controller('auth')
export class AuthController {
constructor(private authService: AuthService) {}
@Post('login')
async login(@Body() body) {
const user = await this.authService.validateUser(body.username, body.password);
if (!user) {
throw new UnauthorizedException();
}
return { token: 'your.jwt.token' };
}
}
这样,你就有了一个基本的认证系统,只允许那些知道正确密码的人进入。希望这能帮到你,如果还有其他问题,随时问我!
Passport
是一个用于 Node.js 的身份验证中间件。它提供了许多策略(例如本地、JWT、OAuth 等)。在使用 NestJS 和 passport-local
进行用户认证时,我们需要安装几个依赖包,并进行一些配置。
安装依赖
首先,你需要安装必要的依赖:
npm install @nestjs/passport passport passport-local bcryptjs @types/bcryptjs @types/passport-local
这里我们使用了 bcryptjs
来安全地存储密码。
配置模块
接下来,创建一个服务来处理用户认证逻辑,并在你的模块中配置 PassportModule
和 LocalStrategy
。
创建 AuthService
import { Injectable } from '@nestjs/common';
import * as bcrypt from 'bcryptjs';
@Injectable()
export class AuthService {
async validateUser(username: string, password: string): Promise<any> {
// 假设这里是你的数据库查询逻辑
const user = await this.findUserByUsername(username);
if (user && await bcrypt.compare(password, user.password)) {
const { password, ...result } = user;
return result;
}
return null;
}
private async findUserByUsername(username: string): Promise<any> {
// 实现你的用户查找逻辑
return {
username: 'test',
password: await bcrypt.hash('password', 10),
};
}
}
创建 LocalStrategy
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 readonly authService: AuthService) {
super();
}
async validate(username: string, password: string): Promise<any> {
const user = await this.authService.validateUser(username, password);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
在模块中注册策略和 Guard
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { LocalStrategy } from './local.strategy';
import { PassportModule } from '@nestjs/passport';
import { UsersModule } from '../users/users.module';
@Module({
imports: [PassportModule, UsersModule],
providers: [AuthService, LocalStrategy],
})
export class AuthModule {}
使用 @UseGuards(AuthGuard('local'))
最后,在你的控制器中使用 AuthGuard('local')
来保护你的路由。
import { Controller, Post, Body, UseGuards } from '@nestjs/common';
import { AuthService } from './auth.service';
import { AuthCredentialsDto } from './dto/auth-credentials.dto';
import { LocalAuthGuard } from './local-auth.guard';
@Controller()
export class AuthController {
constructor(private authService: AuthService) {}
@UseGuards(LocalAuthGuard)
@Post('/login')
async login(@Body() authCredentialsDto: AuthCredentialsDto) {
return this.authService.login(authCredentialsDto);
}
}
这个例子展示了如何在 NestJS 中集成 passport-local
进行简单的用户名/密码认证。确保在实际应用中实现安全的数据存储和传输。
passport-local
是一个用于 Node.js 的本地策略认证模块,常与 NestJS 框架结合使用来处理基于用户名和密码的身份验证。首先,安装必要的包:
npm install @nestjs/passport passport passport-local
然后,在你的模块中配置 Passport 和本地策略:
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './strategies/local.strategy';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'local' }),
],
providers: [LocalStrategy],
})
export class AuthModule {}
定义 LocalStrategy
:
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';
@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
constructor() {
super();
}
async validate(username: string, password: string): Promise<any> {
// 在这里添加你的验证逻辑
}
}
最后,在控制器中应用该策略。