iT邦幫忙

2019 iT 邦幫忙鐵人賽

2

這篇介紹 API 服務整合

若頁面內容不全靠 SSR 產生,部分頁面資料得透過瀏覽器向第三方、自架 API 後端抓取,會碰到跨域 + CORS 問題。

為什麼需要特別處理跨域請求?

瀏覽器為了防止惡意網站竊取資料,採用同源政策,防止惡意網站 B 竊取你在 A 站的 Cookie,像是藉由你已登入 Amazon 的 Cookie,盜用身份買東西。

「同源」定義很簡單,以下三個參數都相同

[protocol]://[domain]:[port]

白話說,當你在 https://www.example.com/product.html 頁面

嘗試對以下路徑發出請求,都違反同源

乖孩子遵守同源,不會被打

第一關考驗沒過,這時請求會遵循 CORS 規則,打第二關
我們可以透過上一章「反向代理」直接處理同源,就先不用討論 CORS 規則。


首先第一種 - Reverse Proxy

https://ithelp.ithome.com.tw/upload/images/20181122/201034245wOmWxmcUp.png

在 nginx.conf 設定 api 反向代理,讓同一個網域下

  • /api 請求轉給 API Service (可能是 Node Server 或其他語言寫的 API 服務)
  • 其他請求都轉給 Nuxt

第二種,透過 Nuxt 做 Proxy - @nuxtjs/proxy

https://ithelp.ithome.com.tw/upload/images/20181122/20103424WznQns3MVS.png

nginx 設定同上一篇,domain 下所有請求都轉給 Nuxt

Nuxt 再透過 proxy module (@nuxtjs/proxy),把 /api 請求轉發給另一個 API Service

使用方式

安裝 @nuxtjs/proxy,nuxt.config.js 設定 @nuxtjs/proxy

{
  modules: [
   '@nuxtjs/proxy',
  ],
  proxy: [
    // Proxies /api/products/*/**.json to http://127.0.0.1:8080
    'http://127.0.0.1:8080/api/products/*/**.json',
  ]
}

補充

兩種做法都可以符合同源政策,至於優缺比較

以前端角度偏好 @nuxtjs/proxy (設定不需要透過 DevOps 或後端),但也因所有 API 請求得透過 Nuxt,會造成效能瓶頸。

若有公司有 DevOps 或其他人管機器,請人設定反向代理會比較好。


上一篇
31. Nuxt 部署 - 反向代理
系列文
Nuxt - 使用 Vue.js 做 SSR 的第一哩路32

尚未有邦友留言

立即登入留言