我试图通过cookie在浏览器中存储JWt令牌。
Axios对前端的调用如下:
const accessToken = jwt.sign({ email }, process.env.ACCESS_TOKEN_SECRET);
console.log(accessToken)
res.cookie('jwt', accessToken, { httpOnly: true })
// console.log("Cokkie set is", cookie);
res.json({ message: 'Logged in successfully' });
在express中发布请求/登录路由如下:
const res = await axios.post(
`${process.env.REACT_APP_API_URL}/login`,
{
email: loginInputs.email,
password: loginInputs.password,
},
{
// credentials: 'include',
withCredentials: true,
}
)
CORS策略设置如下:
const corsOptions = {
origin: process.env.FRONTEND_URL,
credentials: true,
optionsSuccessStatus: 200,
// exposedHeaders: \['Set-Cookie', 'Date', 'ETag'\]
};
app.use(cors(corsOptions));
app.options('\*', cors(corsOptions))
这段代码在Postman中运行良好,正在设置cookie,但在浏览器中抛出以下错误。目前客户端和服务器都在本地主机上工作!
login:1 CORS策略已阻止从源“http://localhost:3000”访问位于“http://localhost:8080/login”的XMLHttpRequest:对印前检查请求的响应未通过访问控制检查:当请求的凭据模式为“include”时,响应中“Access-Control-Allow-Origin”标头的值不能为通配符“*”。XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。
我尝试了Express Session Cookie Not Being Set when using React Axios POST Request中提到的所有方法,但无法解决错误。
2条答案
按热度按时间liwlm1x91#
cors
中间件的origin
配置应为http://localhost:3000
,增加http
方案。参见Origin文档,有效的origin
语法为:通知浏览器允许来自源https://developer.mozilla.org的请求代码访问资源的响应将包括以下内容:
如果服务器向浏览器发送下面的响应头。
运行在
http://localhost:3000
上的客户端向http://localhost:8080/api/login
发送HTTP请求,请求头Origin
将是:Access-Control-Allow-Origin
与Origin
不匹配,则用户代理将抛出CORS错误。Origin
请求头由浏览器自动添加到HTTP请求中。如果用户代理需要请求包含在页面中的资源,或者由它执行的脚本获取的资源,则页面的
origin
可以包括在请求中。但您的错误消息是:当请求的凭据模式为'include'时,响应中'Access-Control-Allow-Origin'头的值不能为通配符'*'
如果您想将cookie从客户端发送到服务器,请使用
fetch
选项。然后不要将origin
设置为通配符'*'
,而将credentials: true
设置为cors
中间件。例如
server.ts
:client/index.html
:启动API服务器:
启动Web服务器:
使用URL访问前端:
http://localhost:3000
控制台日志:
sqougxex2#
我意识到我已经使用了两次app.use(cors())。后端server.js文件具有
由于(1)在(2)之前执行,所以抛出错误。代码现在运行得很好,代码部分只在(2)中。
注意:一定要确保代码片段的顺序。小错误,但有时很难通过它!