2017-08-15 41 views
-1

我遇到了一些Cors和標頭的問題。我有以下中間件:Cors和標頭

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(); 

之後,我有另外一箇中間件來檢查令牌:

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" 
      }); 
    } 

但是,當我登錄req.headers:

{ 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' } 

沒有「X -access-token「,除了在」access-control-request-headers「中。這只是名字。有些東西一定是錯的,但是當我使用GOOGLE時發現的所有東西都是使用Access-Control-Allow-Headers

+0

我應該使用res.set()嗎?什麼應該是價值和關鍵? – gelv

回答

2

您正在查看preflight OPTIONS request。可以由許多條件觸發,其中之一是「設置非標準標題」(如X-access-token)。

瀏覽器不會發出POST請求(使用X-access-token標頭),直到服務器響應OPTIONS請求提供權限。

您需要從您的令牌檢查中間件中排除OPTIONS請求,以便您不會發送403迴應預檢(其中不會包含令牌)。

+0

我檢查是否有OPTIONS請求,如果是這種情況,我發送200.但是隻有一個OPTION請求發送,並且沒有POST請求。在OPTIONS請求後沒有更多的事情發生。 – gelv

+0

開發人員工具中的控制檯上的瀏覽器報告是否收到OPTIONS請求? (我想它告訴你,當它是一個預檢查的請求時,你不能爲Access-Control-Allow-Origin設置通配符) – Quentin

+0

「請求標頭字段授權不允許Access-Control-Allow-Headers in預檢反應「。我很笨,剛剛看了一下網絡選項卡,而不是第一個控制檯 - 因此我的第一個評論。 – gelv