在使用NestJS结合Passport-JS的AuthGuard时,处理cookies是一个常见的需求。Cookies通常用于存储会话信息,以便在客户端和服务器之间保持状态。以下是如何在NestJS中使用Passport-JS AuthGuard来操作cookies的基础概念和相关步骤:
在NestJS中,你可以通过@nestjs/passport
和passport
模块来集成Passport-JS。以下是一个简单的例子,展示如何在AuthGuard中设置和读取cookies。
首先,确保你已经安装了必要的npm包:
npm install @nestjs/passport passport passport-local cookie-parser
在你的NestJS应用中配置Passport:
import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './local.strategy';
import { AuthService } from './auth.service';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'local' }),
],
providers: [AuthService, LocalStrategy],
})
export class AuthModule {}
创建一个AuthGuard来保护你的路由:
import { Injectable } from '@nestjs/common';
import { CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy as JwtStrategy } from 'passport-jwt';
@Injectable()
export class JwtAuthGuard extends PassportStrategy(JwtStrategy) {
constructor(private reflector: Reflector) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: process.env.JWT_SECRET,
});
}
canActivate(context: ExecutionContext): boolean | Promise<boolean> {
const roles = this.reflector.get<string[]>('roles', context.getHandler());
if (roles) {
const request = context.switchToHttp().getRequest();
const jwt = this.extractJwt(request);
const { role } = jwt.payload;
if (!roles.includes(role)) {
throw new UnauthorizedException('You do not have permission to access this resource');
}
}
return super.canActivate(context);
}
}
在你的控制器中,你可以使用cookie-parser
中间件来解析请求中的cookies,并使用Passport来设置认证状态。
import { Controller, Get, UseGuards, Response } from '@nestjs/common';
import { Response as ExpressResponse } from 'express';
import { AuthGuard } from '@nestjs/passport';
@Controller('profile')
export class ProfileController {
@UseGuards(AuthGuard('jwt'))
@Get()
getProfile(@Req() req, @Res() res: ExpressResponse) {
// 设置一个cookie
res.cookie('profileId', '12345', { maxAge: 900000, httpOnly: true });
// 读取cookie
const profileId = req.cookies.profileId;
return { message: 'Profile page', profileId };
}
}
cookie-parser
中间件未正确配置,或者cookies的属性(如httpOnly
、secure
等)设置不正确。app.module.ts
中引入并使用CookieParser
模块,并检查cookies的属性设置是否符合你的安全策略。import { Module } from '@nestjs/common';
import { CookieParser } from '@nestjsplus/cookie-parser';
@Module({
imports: [
CookieParser(),
// ...其他模块
],
})
export class AppModule {}
@UseGuards(AuthGuard('jwt'))
装饰器,并检查Passport策略配置是否正确。通过以上步骤,你应该能够在NestJS中成功使用Passport-JS AuthGuard来操作cookies。如果你遇到具体的问题,可以根据错误信息进一步调试和解决。
领取专属 10元无门槛券
手把手带您无忧上云