2017-07-30 30 views
1

我與取過CORS舉步維艱,授權:取 - 迴應預檢響應

const token = 'this.is.secret!'; 
fetch('http://corsserver/api/hello', { 
    method: 'get', 
    credentials: 'include', 
    mode: 'cors', 
    headers: { 
     'Authorization': `Bearer ${token}`, 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
}).then(response => { 
    console.log(response); 
}).catch(error => { 
    console.log(error); 
}); 

當我運行這個請求,Chrome會將標題爲:

Request Method:OPTIONS

我看這個和it's a preflighted request

我的意思是,這是非常酷的東西。但是,我無法弄清如何在預檢恢復正常後發送實際請求!下一步是什麼?我如何發送GET請求?

我在這裏錯過了一些非常基本的東西。

+0

附帶說明:似乎沒有必要爲'GET'請求發送'Content-Type'請求標頭...'GET'中沒有內容給予內容類型... – sideshowbarker

+0

我在猜測OPTIONS可能由於服務器要求對該OPTIONS請求進行認證而失敗。請參閱我剛纔討論的答案 – sideshowbarker

回答

1

如果OPTIONS請求成功,您的瀏覽器將自動發送實際的GET請求。但是,如果OPTIONS請求不成功,瀏覽器將永遠不會發出GET請求。

而且沒有其他方式使GET請求與瀏覽器做OPTIONS

因此,如果瀏覽器沒有執行GET請求,它只能意味着OPTIONS必須失敗,並且您需要找出原因。瀏覽器應該將原因記錄到devtools控制檯,所以你應該從檢查那裏開始(然後編輯/更新問題來添加該信息,或者發佈一個新的單獨的更具體的問題和錯誤消息) 。什麼問題可能是


一個猜測:也許服務器需要爲OPTIONS要求認證。如果是這樣,您需要修復它,以便服務器不會 - 因爲當瀏覽器發出OPTIONS請求時,它不會從您的代碼發送Authorization標頭+值。

而是實際上在這種情況下,OPTIONS請求的全部目的是瀏覽器的要求,你確定與獲得跨域請求,其中包括了Authorization請求頭?,並且服務器以指示其是否允許Authorization標頭的方式進行響應。

因此,服務器必須配置爲響應任何OPTIONS請求(來自允許的來源至少)與2xx成功響應,而不需要驗證。

您知道服務器是否要求對該OPTIONS請求進行身份驗證的方式是,如果瀏覽器正在記錄的CORS錯誤消息顯示OPTIONS響應的401狀態。


爲使Node.js服務器環境中處理OPTIONS示例代碼:

if (req.method === 'OPTIONS') { 
    res.send(); 
    return; 
} 

...使服務器發送無響應的身體,這是你想要的這個200響應。請注意,這明確允許所有的OPTION請求。