簡體   English   中英

Node JS:只允許服務器端調用我的 api

[英]Node JS : Allow only server side calls to my api

我一直在絞盡腦汁想一個簡單的解決方案。 可以說,我的 Node JS 應用程序中有 10 個 API 端點。

我已經允許其中 3 個公開,其余 4 個具有基於 JWT 的身份驗證

現在我還有 3 條路由,它們沒有 JWT,我只需要允許服務器端調用。 沒有瀏覽器或 curl 或郵遞員,應該能夠調用它們。 如何從請求對象中識別它來自服務器?

或者換句話說,我如何拒絕對我的 api 的所有跨源調用? 由於服務器端不屬於 CORS,他們應該過濾

- - - 編輯 - - -

我最近遇到了一個使用用戶代理頭來阻止服務器端調用的服務。 我可以為我的服務強制執行用戶代理標頭並確保標頭沒有瀏覽器代理嗎? 這很容易被蒙蔽,但作為一個理論上的解決方案,丟棄用戶代理引用瀏覽器代理的請求的 nodejs 攔截器是什么?

您可以使用express-ipfilter包並將其僅應用於您要保護的某些路由:

const express = require('express'),
      ipfilter = require('express-ipfilter').IpFilter;

// Whitelist the following IPs
const ips = ['127.0.0.1'];

// Create the route
app.get("/securePath", ipfilter(ips, {mode: 'allow'}), (req, res) => {
  // only requests from 127.0.0.1 (localhost/loopback) can get here
});

app.get("/openPath", (req, res) => {
  // all requests can get here
});

app.listen(3000);

如果您在代理后面使用 Node,則可能需要配置代理以設置具有實際 IP 的標頭,然后將ipfilter函數的detectIp屬性中的函數傳遞給第二個參數。

假設您正在使用 nginx 並將其配置為通過x-Real-IP標頭發送原始 IP,您可以將此函數傳遞給ipfilter

const express = require('express'),
  ipfilter = require('express-ipfilter').IpFilter,
  ips = ['127.0.0.1'];

app.get("/securePath", ipfilter(ips, {mode: 'allow', detectIp: getIp}), (req, res) => {
  // only requests from 127.0.0.1 (localhost/loopback) that go through the proxy can get here.
});

app.get("/openPath", (req, res) => {
  // all requests can get here
});

app.listen(3000);

function getIp(req) { return req.headers["X-Real-IP"] }

對於從客戶端進行 JWT 身份驗證的路由,您應該使用類似的身份驗證/授權。

這意味着調用方服務還應該使用 JWT 令牌進行身份驗證,具有特殊的service role或類似的role (這 100% 由您決定選擇什么約定)。 該令牌應由調用者簽名並由接收微服務驗證。

該解決方案的優點是不依賴於基礎設施,無論服務部署在哪里,它的工作方式都是一樣的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM