Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 服务器和客户端具有相同的主机(localhost),但端口不同(80803000)。我是否可以使用访问控制允许凭据:true?_Javascript_Node.js_Cors_Graphql - Fatal编程技术网

Javascript 服务器和客户端具有相同的主机(localhost),但端口不同(80803000)。我是否可以使用访问控制允许凭据:true?

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

我的服务器运行在localhost:8080上。 我的客户端在localhost:3030上运行。 我想使用httponly cookie设置一个刷新令牌来管理JWT访问令牌的刷新和到期

我的服务器代码如下所示

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请求未成功)。