Javascript 服务器和客户端具有相同的主机(localhost),但端口不同(80803000)。我是否可以使用访问控制允许凭据:true?
我的服务器运行在localhost:8080上。 我的客户端在localhost:3030上运行。 我想使用httponly cookie设置一个刷新令牌来管理JWT访问令牌的刷新和到期 我的服务器代码如下所示Javascript 服务器和客户端具有相同的主机(localhost),但端口不同(80803000)。我是否可以使用访问控制允许凭据:true?,javascript,node.js,cors,graphql,Javascript,Node.js,Cors,Graphql,我的服务器运行在localhost:8080上。 我的客户端在localhost:3030上运行。 我想使用httponly cookie设置一个刷新令牌来管理JWT访问令牌的刷新和到期 我的服务器代码如下所示 app.use( 科尔斯({ 来源: process.env.NODE_env==“生产” ?“abc.com” :“本地主机:3000”, 凭据:正确 }) ); apolloServer.applyMiddleware({app,路径:“/graphql”}); 关于客户,我有 c
app.use(
科尔斯({
来源:
process.env.NODE_env==“生产”
?“abc.com”
:“本地主机:3000”,
凭据:正确
})
);
apolloServer.applyMiddleware({app,路径:“/graphql”});
关于客户,我有
const-link=createHttpLink({
uri:`localhost:8080/graphql`,
凭据:“包括”
});
const客户端=新客户端({
缓存:新的InMemoryCache(),
链接
});
正如所料,我得到了这个错误:
跨源请求被阻止:同一源策略不允许读取远程资源http://localhost:8080/graphql. (原因:CORS请求未成功)。
我希望这样,因为我正在从localhost:3000向localhost:8080发出请求
现在,如果我使用*
更改为允许任何原点
app.use(
科尔斯({
来源:process.env.NODE_env==“生产”?“abc.com”:“*”,
凭据:正确
})
);
我得到跨源请求被阻止:同一源策略不允许在'http://localhost:8080/graphql’. (原因:如果CORS标题“访问控制允许来源”为“*”,则不支持凭据)。
那么我有什么选择呢?当服务器和客户端在不同端口上运行时,是否无法使用httponly cookie发出认证请求?您需要指定实际来源(
http://localhost:3000访问控制允许原点
标题中的
错误消息只是告诉您通配符(*
)不受支持。我决定使用在docker容器中运行的nginx作为代理。这个nginx使用相同的端口号代理服务器和客户端。这样,服务器和客户端看起来都在同一个端口上运行,我们没有CORS问题
我使用的是Ubuntu,所以目前还没有可用的host.docker.internal
。请看
我的docker compose看起来像:
version: "3"
services:
nginx:
container_name: local-nginx
image: nginx:latest
ports:
- "8000:80"
volumes:
- ./data/nginx/local:/etc/nginx/conf.d
command: [nginx-debug, "-g", "daemon off;"]
extra_hosts:
- "host.docker.internal:172.17.0.1"
docker实例将172.17.0.1视为主机IP地址
我的nginx配置看起来像
server
{
listen 80;
server_name localhost;
location /
{
proxy_pass http://host.docker.internal:3000/;
}
location /graphql
{
proxy_pass http://host.docker.internal:8080/graphql;
}
location /health
{
return 200 '{"message": "healthy"}';
add_header Content-Type application/json;
}
}
我的客户端在3000上运行,服务器在8080上运行。但现在两者都通过8000进行代理。据我所知,如果您使用process.env.NODE\u env==“production”,您现有的服务器代码应该可以正常工作?"https://abc.com:“”http://localhost:3000“
-即在原始值中包含协议部分<代码>本地主机:3000
,没有协议部分,不是有效的源代码-它永远不会匹配任何内容。不清楚您为什么会说,“我希望这样,因为我正在从localhost:3000向localhost:8080发出请求”。你为什么这么想?相反,你应该期望它能工作——这就是CORS启用localhost:8080服务器的全部意义。如果你看到我的服务器代码,我实际上已经尝试过这个origin:localhost:3000
。我得到了这个错误跨源请求被阻止:同源策略不允许读取远程资源http://localhost:8080/graphql. (原因:CORS请求未成功)。