如果部署了Docker映像,Node.js Express API不会发送标头

ar7v8xwq  于 2023-01-08  发布在  Docker
关注(0)|答案(1)|浏览(121)

我已经构建了一个Node.js Express API,每当用户使用(POST)/login时,如果成功登录,API将设置授权令牌,如下所示:

@Post('/login')
  @UseBefore(validationMiddleware(LoginUserDto, 'body'))
  async logIn(@Res() res: Response, @Body() userData: LoginUserDto) {
    const { cookie, user } = await this.authService.login(userData);
    res.setHeader('Set-Cookie', [cookie]);
    return user
  }

每当我在本地运行Docker映像时,如果React应用程序请求它,它会成功地在浏览器中创建令牌作为cookie。
由于它是工作的,我部署在Azure和Digitalocean中的API的docker映像(为了看看是否在两者上都工作。但当我尝试使用部署的API登录时,它会成功POST,但在使用React应用程序时,浏览器中不会设置Cookie(在应用程序中,凭据设置为true以保存)。
我尝试用Postman和Insomnia调用部署的API,它们都将保存成功登录后的cookie。
在最后一个实验中,我真的很困惑,因为API在本地运行时在postman和react应用程序中都能按预期工作,但在部署时只在postman中按预期工作,而在React中则不然。我不明白问题是来自react还是来自API。
我也尝试过在react中使用RTK和Axios,都得到了相同的结果。在API的CORS选项中,原点设置为“*”

ecbunoof

ecbunoof1#

已经发现了,似乎在创建cookie时我没有设置Same-Site属性,默认为Lax,它不允许浏览器保存cookie。我将其设置为none,需要在它后面加上 secure

public createCookie(tokenData: TokenData): string {
    return `Authorization=${tokenData.token}; HttpOnly; Max-Age=${tokenData.expiresIn}; SameSite=None; Secure`;
  }

相关问题