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

如何解决Express [Nest.js] - 在 Heroku 产品中未设置 res.cookie()

我正在使用 Next.js(前端)和 nest.js(后端)框架,但我遇到了 HTTP Cookie 的问题。以下代码在通过 localhost 开发中有效,但在将代码发布到 vercel (Next.js) 和 Heroku (nest.js) 时无效

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

// main.ts

union intc32 {
    char c[4];

    int v;
};

int charsToInt(char a,char b,char c,char d) {
    intc32 r = { { a,b,c,d } };
    return r.v;
}

这是我的路线:

  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();

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

@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,};
  }

我将 axios 用于以下登录请求

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);

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

  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,});
  },

然而,这也无济于事。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?