2017-08-15 3 views
-1

Ich habe ein paar Probleme mit Cors und Header. Ich habe die unten Middleware:Cors und Header

res.header('Access-Control-Allow-Origin', '*'); 
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
res.header('Access-Control-Allow-Headers', 'Content-Type,X-Access-Token,Authorization'); 
next(); 

Danach habe ich eine andere Middleware müssen zu prüfen, token:

const token = req.body.token || req.query.token || req.headers['x-access-token']; 

    if (token) { 
     jwt.verify(token, config.jwtKey, (err, decoded) => { 
      if(err) { 
       return res.json({success: false, errmsg: 'Wrong key'}); 
      } else { 
       req.decoded = decoded; 
       next(); 
      } 
     }); 
    } else { 
     return res.status(403) 
      .send({ 
       success: false, 
       message: "No token provided" 
      }); 
    } 

Aber wenn ich req.headers log:

{ host: 'localhost:4556', 
    connection: 'keep-alive', 
    'access-control-request-method': 'POST', 
    origin: 'http://localhost:4200', 
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', 
    'access-control-request-headers': 'authorization,content-type,x-access-token', 
    accept: '*/*', 
    dnt: '1', 
    referer: 'http://localhost:4200/posts', 
    'accept-encoding': 'gzip, deflate, br', 
    'accept-language': 'sv,en-US;q=0.8,en;q=0.6' } 

Es gibt kein „X -access-token "in meinen Headern, außer in" access-control-request-headern ". Und es ist nur der Name. Etwas muss falsch sein, aber alles, was ich beim googlen fand, war Access-Control-Allow-Headers.

+0

Sollte ich res.set() verwenden? Und was sollte der Wert und Schlüssel sein? – gelv

Antwort

2

Sie betrachten ein preflight OPTIONS request. Das kann durch eine Anzahl von Bedingungen ausgelöst werden, von denen eine "Setzt eine nicht standardmäßige Kopfzeile" (wie X-access-token).

Der Browser wird die POST-Anforderung (mit der X-access-token-Kopfzeile) nicht vornehmen, bis der Server auf die OPTIONS-Anfrage reagiert und ihr die Berechtigung erteilt.

Sie müssen OPTIONS-Anfragen von Ihrem Token ausschließen, um die Middleware zu prüfen, so dass Sie 403 nicht als Antwort auf das Preflight zurücksenden (das das Token nie enthalten wird).

+0

Ich überprüfe, ob es eine OPTIONS-Anfrage gibt, und in diesem Fall sende ich 200. Aber es wird nur eine OPTION-Anfrage gesendet und keine POST-Anfrage. Nach der OPTIONS-Anfrage passiert nichts mehr. – gelv

+0

Was meldet der Browser auf der Konsole in den Entwicklertools, wenn er die OPTIONS-Anfrage erhält? (Ich nehme an, es sagt Ihnen, dass Sie keine Wildcard für Access-Control-Allow-Origin setzen können, wenn es sich um eine Preflight-Anfrage handelt) – Quentin

+0

"Request-Header-Feld Autorisierung ist nicht erlaubt von Access-Control-Allow-Headers Preflight-Antwort. " Ich war blöd und habe nur auf den Netzwerk-Tab geschaut, nicht erst auf die Konsole - daher mein erster Kommentar. – gelv