簡體   English   中英

如何在我的應用程序中限制對 API 子集的訪問?

[英]How can I restrict access to a subset of APIs in my application?

假設我有一個 app.js 文件,它公開了 5 個操作(GET 和 POST 的混合):/op1、/op2、/op3、/op4 和/op5。 我想在 2 個不同的服務器上運行相同的 app.js 文件,其中我希望 /op1、/op2、/op3 服務可以在端口#3000 上運行的服務器上訪問,/op4 和/op5 服務可以從端口#500 訪問。無論如何,我可以在不為每個具有相關服務的服務器創建單獨的 app.js 文件的情況下實現這一目標嗎?

您可以創建僅在某些條件下注冊某些路由的條件代碼。

假設運行服務器所需的端口作為命令行參數傳遞或在環境變量中傳遞,並且您已將其讀入局部變量port ,然后您可以有條件地檢查該端口值並決定注冊哪些路由:

if (port === 3000) {
     app.get("/op1", ...)
     app.get("/op2", ...)
     app.get("/op3", ...)
} else {
     app.get("/op4", ...)
     app.get("/op5", ...)
}

將單獨的路由組分解成它們自己的模塊,然后有條件地僅導入適合給定情況的路由文件可能會更清晰。

if (port === 3000) {
     require('routesA')(app);
} else {
     require('routesB')(app);
}

這些模塊中的每一個都將導出一個函數,該函數在此處以app對象作為參數調用,因此每個模塊都可以根據需要注冊它的路由。


我個人的意見與評論中表達的一些內容有些一致,您實際上不需要這樣做。 如果您有兩個獨立的服務器,在不同的端口上有不同的路由,那么您可能應該有兩個獨立的主服務器文件,每個文件都建立了其中一個服務器的配置。

通過適當使用模塊,您可以在兩個服務器之間共享任意多的代碼(如果需要,可以共享多達 99.99%)。

但是,從邏輯上講,兩台服務器的主服務器文件是分開的,因為它們是不同的服務器。 從字面上看,它可能只是一個小外殼,用於建立端口以及它要加載的路由模塊。

您的問題的一個簡單解決方案是使用 api 網關設置。此 api 網關/負載平衡器必須作為單獨的服務器運行,並且單個端點暴露給客戶端應用程序。 你可以使用nginx 將你的請求轉發到基於端點的特定服務器 所以/op1,/op2,/op3 將請求轉發到 server1 /op4,/op5 將請求轉發到 server2

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

但是正如評論中提到的,您可以關注微服務架構,這似乎是解決此問題的更優雅和有效的方法。

https://microservices.io/patterns/microservices.html

暫無
暫無

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

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