如何解决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 举报,一经查实,本站将立刻删除。