CORS正在使用凭证

时间:2019-11-28 13:07:10

标签: node.js angular cors

我是Node和Angular的新手。发送请求withCredentials: true选项时,Cors出现问题。当我发送此类请求时,我得到:

  

响应中“ Access-Control-Allow-Origin”标头的值   当请求的凭据模式为时,不得为通配符'*'   “包含”。`。

在发送不带此选项的请求时,我没有错误。 Angular正在http://localhost:4200上工作,而Nodejs正在http://localhost:1234上工作。似乎cors模块无法正常工作。

在NodeJs服务器中,我使用cors模块:

const cors = require('cors');

const corsOptions = {
  origin: 'http://localhost:4200',
  optionsSuccessStatus: 200,
  credentials: true
};

app.use(cors(corsOptions));

服务器上的请求头:

{ host: 'localhost:1234',
  connection: 'keep-alive',
  'content-length': '44',
  accept: 'application/json, text/plain, */*',
  origin: 'http://localhost:4200',
  'user-agent':
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
  'content-type': 'application/json',
  'sec-fetch-site': 'same-site',
  'sec-fetch-mode': 'cors',
  referer: 'http://localhost:4200/login',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7' }

编辑:像在私有模式下运行浏览器这样的简单事情解决了此问题...

3 个答案:

答案 0 :(得分:2)

您可以通过设置标头来尝试:

app.use(function (req, res, next) {

    // UI port you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
    ...
}

UI:

this.http.get(url, { withCredentials: true })

当我们将凭据传递给后端服务时,必须指定url端口。

答案 1 :(得分:1)

我遇到了同样的问题,不是在这个模块上,而是在开发模式下使用另一台服务器时发送凭据。我认为问题可能出在不安全的连接(http而不是https)中,当然,本地主机始终是被优先处理的。

我使用代理(proxy.conf.json为我解决了此问题,将URL重新路由到预期的URL,使浏览器在开发时认为它是相同的来源。 (此处描述:ANGULAR BUILD GUIDE

{
  "/api": {
    "target": "http://THE_OTHER_URL/WITH/PATH/",
    "secure": false,
    "logLevel": "debug",
    "changeOrigin": true
  }
}

并将其包含在该项目的构建选项下的angular.json中:

... 
"projects" : {
    "YOUR_PROJECT_NAME" : {
        ...
        "architect": {
            ...
            "serve": {
                "builder": "@angular-devkit/build-angular:dev-server",
                "options": {
                    "proxyConfig" : "proxy.conf.json",
                    "browserTarget": "YOUR_PROJECT_NAME:build"
                }
            }
        },
       ...
    }
}

我不确定这是否还能解决您的问题,但也许值得一试。

答案 2 :(得分:1)

在节点中启用跨源资源共享(CORS)。 CORS本质上是指跨域请求。

只需使用此行代码在响应中设置标头,即可启用CORS。

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
});