NestJs 中使用 cookie

HTTP cookie 是用户浏览器存储的一小段数据。Cookie 旨在成为网站记住状态信息的可靠机制。当用户再次访问该网站时,cookie 会自动随请求一起发送。

安装插件

首先安装所需的包(以及 TypeScript 用户的类型):

$ npm i cookie-parser
$ npm i -D @types/cookie-parser

安装完成后,将 cookie-parser 中间件应用为全局中间件。

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(cookieParser());
  await app.listen(3000);
}
bootstrap();

使用 cookie

在响应体中设置 cookie 可以做如下操作:

  • secret 用于签署 cookie 的字符串或数组。这是可选的,如果未指定,将不会解析签名的 cookie。如果提供了字符串,则将其用作 secret。如果提供了数组,将尝试按顺序取消对每个 secret 的 cookie 的签名。需要设置signed属性。
  • options 作为第二个选项传递给 cookie.parse 的对象。

中间件将解析请求上的 Cookie 标头,并将 cookie 数据公开为属性 req.cookies,如果提供了 secret,则公开为属性 req.signedCookies。这些属性是 cookie 名称到 cookie 值的名称值对。

当提供 secret 时,该模块将取消签名并验证任何签名的 cookie 值,并将这些名称值对从 req.cookies 移动到 req.signedCookies 中。签名 cookie 是一个值以 s: 为前缀的 cookie。签名验证失败的签名 cookie 的值将是 false,而不是被篡改的值。

1、请求体中获取 cookie

// 设置了signed属性后,会对cookie进行加密,加密的秘钥就是cookieParser设置的字符串
@Get('/rescookie')
resCookie(@Res({ passthrough: true }) response: Response) {
  response.cookie('key', '123333', { httpOnly: true, expires: new Date('2023-09-10'), signed: true })
}

// 获取请求体中的cookie
@Get()
findAll(@Req() request: Request) {
  console.log(request.cookies);
  // console.log(request.signedCookies); // 获取签名的Cookie
}

2、 响应体中返回 cookie

要将 cookie 附加到传出响应,请使用 Response#cookie() 方法:

@Get('/cookie')
findAll(@Res({ passthrough: true }) response: Response) {
  response.cookie('key', 'demo')
}

说明: response.cookie 的参数有三个,第一个参数是 cookie 的名称,第二个参数是 cookie 的值,第三参数是 cookie 的相关属性值设置,例如设置 cookie 的有效期等属性,具体实例如下:

@Get('/rescookie')
resCookie(@Res({ passthrough: true }) response: Response) {
  response.cookie('key', 'demo', { httpOnly: true, expires: new Date('2023-09-10') })
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NestJS是一个基于TypeScript的开源Web框架,它在Express之上构建,提供了丰富的功能和模块化设计。如果你想要在NestJS应用使用cookies进行用户身份验证或存储数据,你可以遵循这些步骤: 1. **安装依赖**: 首先,确保已经安装了`@nestjs/authentication`和`@nestjs/http`模块,它们包含了处理HTTP请求和身份验证的功能。如果还没有安装,可以通过`npm install @nestjs/authentication @nestjs/http`命令添加。 2. **创建服务**: 在`app.module.ts`或相关的模块,引入`AuthGuard`或自定义的认证策略,并使用`useGlobalGuards`注册它: ```typescript import { Module, GlobalGuard } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; @Module({ providers: [AuthGuard], // ... }) export class AppModule implements GlobalGuard { canActivate(context: ExecutionContext) { // 自定义登录检查逻辑 return true; } } ``` 3. **设置cookie**: 在认证成功后,使用`Response`对象的`setCookie`方法来设置cookie: ```typescript import { Injectable, CanActivate, HttpStatus, HttpResponse } from '@nestjs/common'; import * as cookieParser from 'cookie-parser'; import * as jwt from 'jsonwebtoken'; @Injectable() export class JwtAuthGuard extends AuthGuard('jwt') { canActivate(context: ExecutionContext): boolean { // ...其他认证逻辑 const user = this.getUserFromToken(); // 获取用户信息 if (!user) { return false; } // 设置cookie const token = jwt.sign({ userId: user.id }, 'your-secret-key', { expiresIn: '1h' }); const response = context.switchToHttp().getResponse<HttpResponse>(); response.setCookie('jwt', token, { httpOnly: true, maxAge: 60 * 60 * 1000 }); return true; } } ``` 这里设置了名为`jwt`的cookie,值为JWT令牌,通常`httpOnly`属性会确保cookie不被JavaScript脚本访问,`maxAge`则设置了cookie的有效时间。 4. **验证cookie**: 在每个需要保护的路由或控制器前,使用`@UseGuards(JwtAuthGuard)`装饰器,NestJS会自动在每次请求头查找`jwt` cookie并解码验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值