CORS error :Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response

后端 未结 6 1365
礼貌的吻别
礼貌的吻别 2020-12-08 13:18

I am trying to send the request from one localhost port to the another. I am using angularjs on the frontend and node on the backend.

Since it is

相关标签:
6条回答
  • 2020-12-08 13:56

    This is an API issue, you won't get this error if using Postman/Fielder to send HTTP requests to API. In case of browsers, for security purpose, they always send OPTIONS request/preflight to API before sending the actual requests (GET/POST/PUT/DELETE). Therefore, in case, the request method is OPTION, not only you need to add "Authorization" into "Access-Control-Allow-Headers", but you need to add "OPTIONS" into "Access-Control-allow-methods" as well. This was how I fixed:

    if (context.Request.Method == "OPTIONS")
            {
                context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { (string)context.Request.Headers["Origin"] });
                context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept, Authorization" });
                context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" });
                context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });
    
            }
    
    0 讨论(0)
  • 2020-12-08 13:59

    The res.header('Access-Control-Allow-Origin', '*'); wouldn't work with Autorization header. Just enable pre-flight request, using cors library:

    var express = require('express')
    var cors = require('cors')
    var app = express()
    app.use(cors())
    app.options('*', cors())
    
    0 讨论(0)
  • 2020-12-08 14:03

    First you need to install cors by using below command :

    npm install cors --save
    

    Now add the following code to your app starting file like ( app.js or server.js)

    var express = require('express');
    var app = express();
    
    var cors = require('cors');
    var bodyParser = require('body-parser');
    
    //enables cors
    app.use(cors({
      'allowedHeaders': ['sessionId', 'Content-Type'],
      'exposedHeaders': ['sessionId'],
      'origin': '*',
      'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
      'preflightContinue': false
    }));
    
    require('./router/index')(app);
    
    0 讨论(0)
  • 2020-12-08 14:03

    For anyone getting this using ServiceStack backend; add "Authorization" to allowed headers in the Cors plugin:

    Plugins.Add(new CorsFeature(allowedHeaders: "Content-Type,Authorization"));

    0 讨论(0)
  • 2020-12-08 14:10

    If you don't want to install the cors library and instead want to fix your original code, the other step you are missing is that Access-Control-Allow-Origin:* is wrong. When passing Authentication tokens (e.g. JWT) then you must explicitly state every url that is calling your server. You can't use "*" when doing authentication tokens.

    0 讨论(0)
  • 2020-12-08 14:12

    You have to add options also in allowed headers. browser sends a preflight request before original request is sent. See below

     res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
    

    From source https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS

    In CORS, a preflight request with the OPTIONS method is sent, so that the server can respond whether it is acceptable to send the request with these parameters. The Access-Control-Request-Method header notifies the server as part of a preflight request that when the actual request is sent, it will be sent with a POST request method. The Access-Control-Request-Headers header notifies the server that when the actual request is sent, it will be sent with a X-PINGOTHER and Content-Type custom headers. The server now has an opportunity to determine whether it wishes to accept a request under these circumstances.

    EDITED

    You can avoid this manual configuration by using npmjs.com/package/cors npm package.I have used this method also, it is clear and easy.

    0 讨论(0)
提交回复
热议问题