当前位置: 首页 > 知识库问答 >
问题:

如何在NestJS中设置仅HTTP cookie

松旭
2023-03-14

我正在尝试使用 accessToken 和 refreshToken 实现 JWT 授权。访问令牌和刷新令牌都需要在仅限HTTP的cookie中设置。

我尝试了这段代码,但它没有设置cookie。我在这里使用NestJS框架。

import { Controller, Request, Post, Body, Response } from '@nestjs/common';
@Controller()
export class UserController {
  constructor() {}

  @Post('users/login')
  async login(
    @Request() req,
    @Body() credentials: { username: string; password: string },
    @Response() res,
  ) {
    try {
      // Login with username and password
      const accessToken = 'something';
      const refreshToken = 'something';
      const user = { username: credentials.username };

      res.cookie('accessToken', accessToken, {
        expires: new Date(new Date().getTime() + 30 * 1000),
        sameSite: 'strict',
        httpOnly: true,
      });
      return res.send(user);
    } catch (error) {
      throw error;
    }
  }
}

res.send()方法运行良好,我正在获取数据作为响应。如何在此处设置cookie?

这是我的主要内容。ts文件:-

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Logger } from '@nestjs/common';
import { AuthenticatedSocketIoAdapter } from './chat/authchat.adapter';
import * as cookieParser from 'cookie-parser';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors();
  app.use(cookieParser());
  app.useWebSocketAdapter(new AuthenticatedSocketIoAdapter(app));
  await app.listen(3000);
  Logger.log('User microservice running');
}
bootstrap();

为了获得我正在使用的cookie:-

request.cookies

共有2个答案

公冶浩慨
2023-03-14

我遇到了和你几乎一样的问题。Axios无法保存cookies。设置SameSite所需的Chrome:“none”,secure: true。你仍然没有工作。它确实使用fetch方法保存了cookie,但是只在运行Chromium的浏览器中...所以mozilla没有收到。我的axios是:

const response = await axios.post(url+'/login', loginState, {withCredentials: true});

后端Nestjs:Main.ts:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.setGlobalPrefix('v1/api');
  app.use(cookieParser());
  app.useGlobalPipes(new ValidationPipe());
  app.enableCors({
    credentials: true,
    origin: process.env.FRONTEND_URL,
  })
  await app.listen(3000);
}

我的AuthService登录功能(请记住Res中的passthrought:true)

@Post('login')
async login(
        @Body()body: LoginUserDTO,
        @Res({passthrough: true}) response: Response
    ): Promise<any> {
    const user = await this.userService.getOne({where: {"user_email": body.email}});
    if(!user) {
        throw new NotFoundException('User not found')
    }
    if(!await bcrypt.compare(body.password, user.user_password)) {
        throw new BadRequestException('Password incorrect');
    }
    const frontendDomain = this.configService.get<string>('FRONTEND_DOMAIN');
    const jwtToken = await this.jwtService.signAsync({id: user.user_id});
    response.cookie('jwt', jwtToken, {httpOnly: true, domain: frontendDomain,});

    return {'jwt': jwtToken}
}

奇怪的是,解决我的问题是将域名添加到response.cookie.

还有我用于CORS和cookie域的开发环境变量:

FRONTEND_URL = http://localhost:3333
FRONTEND_DOMAIN = localhost

希望我的代码能帮上忙

郗丰
2023-03-14

评论中的对话:

客户端的Axios需要将< code>withCredentials设置为< code>true才能将cookies发送回服务器。服务器正在按预期发送和设置颜色。

 类似资料:
  • 我只想在假设有一个值列表的单元格中添加一个JComboBox。下面是我的代码,但它在列中的所有单元格中添加了组合框。让我知道我的代码中缺少了什么,以便只在选定的单元格上设置组合框。

  • 我正在使用JAXB来生成一个肥皂xml请求。我想要的当前xml输出是这个 到目前为止,我已经生成了信封和标题标签,但我有安全标签的问题。 我的问题是,如果我尝试将xmlns设置为package-info.class前缀是正确的,但是和转到根元素(信封)而不是安全标记。这是我得到的输出: 正如您在所需的 xml 输出中看到的 和 命名空间位于安全标记处。如何才能将这些xmlns添加到安全标签?以及用

  • 问题内容: 在SQL中,是否有一种方法可以强制一组列中只有一个列具有值,而其他列为null?可能是制约因素还是触发因素?这种类型的东西可能是用于查找表的,但是是否有其他替代表设计可能会更好地完成此工作呢? 例如: 主要问题是这些列都是其他表的FK,因此我无法将它们折叠为单个列。 我正在使用SQL Server,但是任何答案都可以。 问题答案: @tvanfosson的建议约束可以在三列中正常工作,

  • 问题内容: 我正在尝试使用JavaFX中的WebView入门,但是当尝试打开W​​ebView时,我收到以下所示的错误,我该如何解决此问题? 问题答案: 尝试运行WebView时遇到任何错误时,请确保您的VM选项包含模块javafx.web。 虚拟机选项: 在IntelliJ中,您可以通过转到IDE右上方的“编辑配置”按钮来访问VM选项。

  • 问题内容: 我已经使用数据库中的SQL数据库开发了一个窗口服务,该数据库中的记录已满,因此查询执行需要很多时间,而默认命令超时是30S,但我想将其增加到120S。 但是我的应用程序中有很多方法,因此我想从APP.config文件中进行设置,这样它将适用于应用程序级别,任何人都可以告诉我如何实现此目标 谢谢 问题答案: 实现此目的的最简单方法是在类似以下内容的地方添加新条目: 然后,创建一个将填充值

  • 问题内容: 我有一个模型: 如何编写基于类的视图,该视图创建新的模型实例并将外键设置为? 问题答案: 我通过覆盖方法解决了这个问题。下面是详细说明的样式: 但是我们可以简短地说(感谢dowjones123),在docs中提到了这种情况。