Express [Nest.js] - Heroku 生产中未设置 res.cookie()

2024-01-07

我正在使用 Next.js(前端)和 Nest.js(后端)框架,但我遇到了 HTTP Cookie 问题。以下代码有效in通过 localhost 进行开发,但将代码发布到 vercel (Next.js) 和 Heroku (Nest.js) 时则不然

这是我的 Nest.js 设置的片段

// main.ts

  async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: new LoggerService(),
    cors: true,
  });
  app.use(cookieParser());
  app.enableCors({
    origin: ["<my-site>"], 
    credentials: true,
  });
...

  await app.listen(process.env.PORT || 5000);
}
bootstrap();

这是我的路线:

@Post("login/verify")
  @HttpCode(201)
  @ApiResponse({ description: "returns JWT for verified login attempt" })
  async verify(
    @Body() method: VerificationDto,
    @Req() req: Request,
    @Res({ passthrough: true }) res: Response
  ) {
    const { accessToken } = await this.userService.verifyLogin(method);
    const origin = req.get("origin");
    this.loggerService.log(`origin: ${origin}`);

    res
      .set("Access-Control-Allow-Credentials", "true")
      .set("Access-Control-Allow-Origin", origin)
      .cookie("accessToken", accessToken, {
        expires: new Date(new Date().getTime() + 60 * 1000 * 60 * 2),
        sameSite: "none",
        secure: true,
        httpOnly: false,
      });

    return {
      accessToken,
      refreshToken,
    };
  }

这是我在 Next.js 中的 useAuth 组件

import React from "react";
import jwtDecode from "jwt-decode";
import nookies from "nookies";
import { redirect } from "../../services/redirect";
import { GetServerSideProps, NextPage } from "next";

export interface User {
  accessToken: string;
  email: string;
  exp: number;
  iat: number;
  id: string;
  name: string;
  roles: Array<string>;
}

const AuthContext = React.createContext<User>(null as unknown as User);

const loginRoute = `/login`;

export const authenticate = (
  getServerSidePropsInner: GetServerSideProps = async () => ({ props: {} })
) => {
  const getServerSideProps: GetServerSideProps = async ctx => {
    const { req, res } = ctx;

    if (!req.headers.cookie) {
      console.log("no cookie found");
      redirect(ctx, loginRoute);
      return { props: {} };
    }
    const { accessToken } = nookies.get(ctx);
    console.log(accessToken);
    let user = null;
    try {
      user = {
        accessToken,
        ...(jwtDecode(accessToken as string) as object),
      };
    } catch (e) {
      console.log(e);
      redirect(ctx, loginRoute);
    }

    const result = await getServerSidePropsInner(ctx);
    return {
      ...result,
      props: {
        user,
        //@ts-ignore
        ...result.props,
      },
    };
  };
  return getServerSideProps;
};

export const withAuth = (C: NextPage) => {
  const WithAuth = (props: any) => {
    const { user, ...appProps } = props;
    return (
      <AuthContext.Provider value={user}>
        <C {...appProps} />
      </AuthContext.Provider>
    );
  };

  WithAuth.displayName = `WithAuth(${C.displayName})`;
  return WithAuth;
};

export default withAuth;

export const useAuth = (): User => React.useContext(AuthContext);

我正在使用 axios 并发出以下登录请求

  verifyLogin: ({ code, email }: { code: string; email: string }) => {
    return axios(`${apiURI}/user/login/verify`, {
      method: `POST`,
      withCredentials: true,
      headers: {
        "Content-Type": "application/json",
      },
      data: {
        code: code,
        email: email,
      },
    });
  },

安装程序适用于本地主机。它添加了一个由 next.js 应用程序读取的 http cookie。 但是,当将我的 Nest.js 应用程序部署到 Heroku 时,cookie 似乎不会发送到下一个应用程序。我尝试为 CookieOptions 添加不同的值

        sameSite: "none",
        secure: true,
        httpOnly: false,

然而,这也没有帮助。

非常感谢任何帮助,因为我已经为此奋斗了好几天。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Express [Nest.js] - Heroku 生产中未设置 res.cookie() 的相关文章

  • 操作 `posts.find()` 缓冲在 10000 毫秒后超时

    当我在本地尝试时 效果非常好 但 Heroku 在服务器部署后出现此错误 有人可以帮忙吗 message Operation posts find buffering timed out after 10000ms index js con
  • “PG DuplicateTable:错误关系“产品”已存在”- Heroku db:迁移尝试

    Rails 菜鸟尝试将 DB 迁移到 Heroku 请原谅这个错误消息的多汁性 但我认为将其全部包含在内可能很重要 我不知道为什么会发生这种情况 也不知道这意味着什么 我的架构中只有一张产品表和一张创建产品迁移表 Migrating to
  • 将图像文件存储在猫鼬模式的二进制数据中并以html形式显示图像

    我正在使用 Express Node js 和 Mongodb 创建上传和显示图像文件的网页 我使用 schema 将图像的二进制文件保存在 mongodb 中 这是我在index js和db js中的一点代码 var Post mongo
  • 快递+护照+会话。为每个页面加载执行查询

    我正在使用 Express 4 2 0 和 Passport 0 2 0 我使用的express session中间件是1 2 1 我对节点身份验证比较陌生 所以请耐心等待 我注意到 对于每个页面加载 护照正在执行数据库请求 Executi
  • 如何从应用程序内识别 heroku dyno 编号?

    有没有办法从应用程序中识别 heroku dyno 名称 例如 web 1 web 2 我希望能够生成一个唯一的请求 ID 例如 跟踪网络和工作测功机之间的请求 以统一记录整个请求堆栈 在我看来 测功机标识符将是一个不错的起点 如果这不能做
  • 静态文件配置不正确

    我已经在 Heroku 上部署了简单的博客应用程序 它运行在Django 1 8 4 我在静态文件方面遇到了一些问题 当打开我的应用程序时 我看到Application Error页面 所以我尝试调试它并发现当我提交到 Heroku 时它无
  • NodeJS 内存增长 - (系统)内存泄漏?

    我在我们的生活环境中遇到了奇怪的内存泄漏 其中 system 堆中的对象不断增长 堆转储 Here is a memory dump where the memory usage grew to 800MB 请注意 该内存保留在Genera
  • Angular2 - 在 SystemJS 中导入第 3 方 javascript

    由于某种原因 fileSaver 没有被映射 angular2 jwt 工作正常 I did npm install file saver save获取文件保护程序 然后按如下方式引用它 我有一个 gulp 任务将 js 文件移动到 lib
  • CSS 未使用 req.params 或其他内容加载

    我对节点 表达等非常陌生 我制作了一个博客应用程序 但遇到了问题 我正在使用 mongoose node express 和 ejs 当我打电话时 router get posts function req res Post find fu
  • Silverlight WCF服务跨域问题

    我有一个 silverlight 应用程序 托管在 Intranet mydomain net 和一个 WCF 服务 webservices mydomain net 我需要跨站点策略文件吗 如果是这样 只允许从 Intranet mydo
  • Express+jade:局部变量在视图中不可用

    我遇到了一个非常基本的问题 但我似乎找不到答案 我正在与node js express我只是想将局部变量传递到视图中 如下所示 app get function req res res render index locals title B
  • 阻止 PM2 上不同时运行的请求

    在我的 Express 应用程序中 我在应用程序中定义了 2 个端点 一种用于 is sever up 检查 另一种用于模拟阻塞操作 app use status req res gt res sendStatus 200 app use
  • 警告:您的 git 版本是 1.9.3。存在严重的安全漏洞

    我在部署到 Heroku 期间收到有关 git 1 9 3 严重安全漏洞的警告 我尝试通过 homebrew 更新 git 但发现 git 最初并不是通过 homebrew 安装的 然后我通过自制程序安装了它 brew update bre
  • PassportJS - 自定义回调并将 Session 设置为 false

    是否可以使用自定义回调并禁用会话 在文档中 它显示了如何禁用会话和自定义回调 但如何组合它们 app get login function req res next passport authenticate local function
  • Express.js - 监听关闭

    我有一个使用 Express 的 Node js 应用程序 在该应用程序中 我有一个如下所示的块 const app require app const port process env PORT 8080 const server app
  • 在express中root后通过可选参数传递路由控制?

    我正在开发一个简单的网址缩短应用程序 并有以下快速路线 app get function req res res render index link null app post function req res function makeR
  • Node.js 中没有请求状态 Morgan Logging

    我正在 Azure VM 上运行 node js 应用程序 使用 PM2 处理负载平衡和重新启动 这是服务器设置和日志记录代码 var logger require morgan var app express app set views
  • 错误:模块“html”不提供视图引擎(Express)

    我正在尝试设置一个简单的路由应用程序 但在渲染页面时不断遇到错误 Error Module html does not provide a view engine 奇怪的是我已经在 app js 文件中指定了视图引擎 但仍然收到错误 app
  • 以异步方式执行 Express res.render

    我有一个 Nodejs 应用程序 其中res renderExpress 方法以阻塞方式花费大约 400 毫秒 我如何处理它以非阻塞方式执行 我的 apache 基准测试需要 12 秒来执行大约 30 个并发请求 我如何以更好的方式实施这一
  • Rails、REST 架构和 HTML 5:带有预检请求的跨域请求

    在致力于使我们的网站 HTML 5 友好的项目时 我们渴望采用跨域请求的新方法 不再通过隐藏的 iframe 发布 使用访问控制 http www w3 org TR access control 根据规范 我们开始设置一些测试来验证各种浏

随机推荐