The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

使用 Data API builder 快速實現安全的 CRUD 應用程式

微軟最近推出了一個開發工具叫 Data API builder (DAB),這是一套開源的資料處理引擎,他可以快速的將資料庫的資料轉換成 REST 與 GraphQL API 端點(Endpoint),方便我們快速的建立安全的 CRUD 應用程式。有了 Data API builder 之後,針對大多數 CRUD 類型的應用程式,幾乎都可以在幾分鐘之內完成 API 開發,只要使用一些前端框架就可以快速的建立一個完整的應用程式。

簡介 Data API builder

Data API builder 可以透過 REST 或 GraphQL 端點安全地公開資料庫物件 (Table, View, Stored Procedure),以便可以在任何平台、任何語言和任何裝置上存取您的資料。透過整合且靈活的策略引擎,也可以確保精細的安全性設定,確保資料安全。目前 Data API builder 支援 Azure SQL Database、SQL Server、PostgreSQL、MySQL 和 Cosmos DB 等資料庫整合,為開發人員提供了前所未有的效率提升。

Data API builder 是開源的,可在任何平台上運行。它可以透過 Azure Static Web App 中提供的新功能 Database Connection (資料庫連線) 執行,也可以跑在本機或容器中。

Data API builder 的運作架構可以從下圖理解:

Data API builder

安裝 Data API builder

目前的 Data API builder 是基於 .NET 6.0 開發的,並且發佈為 .NET 全域工具 (Global Tool),所以你只要先安裝 .NET SDK 之後,就可以透過以下命令安裝:

dotnet tool install -g microsoft.dataapibuilder

安裝完成之後,就可以透過以下命令來查看 Data API builder 安裝的版本:

dab --version
C:\>dab --version
Microsoft.DataApiBuilder 0.8.52+c69925060e1942d28515b9c4b89ea24832da0c7c

快速上手 Data API builder

以下我就用一個完整的例子來示範 Data API builder 的開發方法:

  1. 先在 SQL Server 建立 ContosoUniversity 資料庫

  2. 準備一個專案目錄

    mkdir dab
    cd dab
    
  3. 初始化 Data API builder 設定檔

    dab init --database-type "mssql" --connection-string "Server=(localdb)\MSSQLLocalDB;Database=ContosoUniversity;Trusted_Connection=True;TrustServerCertificate=true" --host-mode "Development"
    

    執行結果訊息:

    Information: Microsoft.DataApiBuilder 0.8.52+c69925060e1942d28515b9c4b89ea24832da0c7c
    Information: Generating default config file: G:\Projects\dab\dab-config.json
    Information: Config file generated.
    Information: SUGGESTION: Use 'dab add [entity-name] [options]' to add new entities in your config.
    

    這個步驟會建立一個 dab-config.json 設定檔,內容如下:

    {
      "$schema": "https://github.com/Azure/data-api-builder/releases/download/v0.8.52/dab.draft.schema.json",
      "data-source": {
        "database-type": "mssql",
        "connection-string": "Server=.\\SQLEXPRESS;Database=ContosoUniversity;Trusted_Connection=True;TrustServerCertificate=true",
        "options": {
          "set-session-context": false
        }
      },
      "runtime": {
        "rest": {
          "enabled": true,
          "path": "/api"
        },
        "graphql": {
          "enabled": true,
          "path": "/graphql",
          "allow-introspection": true
        },
        "host": {
          "cors": {
            "origins": [],
            "allow-credentials": false
          },
          "authentication": {
            "provider": "StaticWebApps"
          },
          "mode": "development"
        }
      },
      "entities": {}
    }
    
  4. 加入資料實體與資料來源的對應

    這裡我們加入資料庫中的 dbo.Coursedbo.Department 表格,並對應到 CourseDepartment 實體(Entity),另外最重要的 --permissions 用來設定資料存取的權限,第一次在本機使用可以先設定為 anonymous:*,這意味著我們透過 Data API builder 產生的 API Endpoing 允許「匿名存取」,且 * 代表支援所有動作(Action):

    dab add Course --source dbo.Course --permissions "anonymous:*"
    dab add Department --source dbo.Department --permissions "anonymous:*"
    
  5. 啟動 Data API builder

    dab start
    

    啟動之後就擁有了相當完整的 API 端點(REST + GraphQL)可以呼叫,而且也有提供 Swagger 介面與 OpenAPI Spec 可供參考:

    Swagger: https://localhost:5001/swagger

    Swagger

    OpenAPI: https://localhost:5001/api/openapi

    OpenAPI

    GraphQL: https://localhost:5001/graphql

    GraphQL

總結

看到這裡你應該可以發現,我們的整個專案只有「一個檔案」而已,也就是 DAB 的設定檔 dab-config.json,然後就沒有然後了,整個資料庫指定的表格都可以快速的產生 REST 與 GraphQL 的 API Endpoint,直接可以呼叫使用,而且 CRUD 都可以直接使用!

方便歸方便,安全性才是最重要的,目前 DAB 可以支援 AuthenticationAuthorization 設定,不但可以限定特定實體的存取權限,也可以針對特定欄位(Field access)進行權限控管,透過 Database policy 控制,甚至可以做到 Item level security,這樣其實可以避免資料外洩的風險。

不過,目前 DAB 僅能支援 StaticWebApps (EasyAuth) 與 AzureAD 這兩個身分認證提供者,使用上還算有點受限:

  1. StaticWebApps

    限定網站必須部署到 Azure Static Web Apps 才能使用,但是透過 EasyAuth 可以支援多家 Identity provider 的支援,靈活性好很多。

  2. AzureAD

    限定身分認證必須透過 Azure AD 來完成,如果你的組織使用 Microsoft 365 的話,這個應該是最方便的。所以我認為目前 DAB 比較適用於「企業內部」的 CRUD 類型的應用程式開發,可以節省大量開發時間,短時間內就可以開發出 API 來用。

如果要使用其他的身份驗證服務我還沒有深入研究,不過由於 DAB 是一套開放原始碼的專案,所以還是很有機會可以自行實作其他身份驗證服務的整合。

最後,我覺得 DAB 還是有很大的進步空間,目前無法實作太多需要「個人化」的資料查詢,所以 DAB 比較適用在「以資料為中心」的應用程式,若是有太多「個人化」或「商務邏輯」的 LOB 應用程式,就不太適合。

相關連結

留言評論