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

微軟最近推出了一個開發工具叫 [Data API builder](https://github.com/Azure/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 是[開源的](https://github.com/Azure/data-api-builder)，可在任何平台上運行。它可以透過 Azure Static Web App 中提供的新功能 [Database Connection](https://learn.microsoft.com/en-us/azure/static-web-apps/database-overview) (資料庫連線) 執行，也可以跑在本機或容器中。

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

![Data API builder](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5732a8d8c6ddcefe1e6d-a9b58374-1e2b-4303-bab3-d7d95582d05b.webp)

### 安裝 Data API builder

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

```bash
dotnet tool install -g microsoft.dataapibuilder
```

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

```bash
dab --version
```

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

### 快速上手 Data API builder

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

1.  先在 SQL Server 建立 [ContosoUniversity](https://gist.githubusercontent.com/doggy8088/2a2f7075d49b3814d19513426ede3549/raw/ab95b323425ff98e99b901793d0361d90439fb0b/ContosoUniversity.sql) 資料庫
    
2.  準備一個專案目錄
    
    ```
    mkdir dab
    cd dab
    ```
    
3.  初始化 Data API builder 設定檔
    
    ```batch
    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` 設定檔，內容如下：
    
    ```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.Course` 與 `dbo.Department` 表格，並對應到 `Course` 與 `Department` 實體(Entity)，另外最重要的 `--permissions` 用來設定資料存取的權限，第一次在本機使用可以先設定為 `anonymous:*`，這意味著我們透過 Data API builder 產生的 API Endpoing 允許「匿名存取」，且 `*` 代表支援所有動作(Action)：
    
    ```powershell
    dab add Course --source dbo.Course --permissions "anonymous:*"
    dab add Department --source dbo.Department --permissions "anonymous:*"
    ```
    
5.  啟動 Data API builder
    
    ```batch
    dab start
    ```
    
    啟動之後就擁有了相當完整的 API 端點(REST + GraphQL)可以呼叫，而且也有提供 Swagger 介面與 OpenAPI Spec 可供參考：
    
    Swagger: [https://localhost:5001/swagger](https://localhost:5001/swagger)
    
    ![Swagger](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5ecd14cb59f12c95f662-a784fd71-322d-47d3-8836-66ab55baa88f.webp)
    
    OpenAPI: [https://localhost:5001/api/openapi](https://localhost:5001/api/openapi)
    
    ![OpenAPI](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/dbdd0ba2e72f1f84e18d-33087380-3a23-4d2c-87b4-a671e2bb7615.webp)
    
    GraphQL: [https://localhost:5001/graphql](https://localhost:5001/graphql)
    
    ![GraphQL](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/900cf82bdbd57791ebca-f04e8dc3-367e-4270-b8f1-b045bec51148.webp)
    

### 總結

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

方便歸方便，安全性才是最重要的，目前 DAB 可以支援 [Authentication](https://learn.microsoft.com/en-us/azure/data-api-builder/authentication?WT.mc_id=DT-MVP-4015686) 與 [Authorization](https://learn.microsoft.com/en-us/azure/data-api-builder/authorization?WT.mc_id=DT-MVP-4015686) 設定，不但可以限定特定實體的存取權限，也可以針對**特定欄位**([Field access](https://learn.microsoft.com/en-us/azure/data-api-builder/authorization?WT.mc_id=DT-MVP-4015686#field-access))進行權限控管，透過 `Database policy` 控制，甚至可以做到 [Item level security](https://learn.microsoft.com/en-us/azure/data-api-builder/authorization?WT.mc_id=DT-MVP-4015686#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 應用程式，就不太適合。

### 相關連結

-   [DAB Repository](https://aka.ms/dab/repo)
-   [NuGet Gallery | Microsoft.DataApiBuilder 0.8.52](https://www.nuget.org/packages/microsoft.dataapibuilder#versions-body-tab)
-   [DAB Documentation](https://learn.microsoft.com/en-us/azure/data-api-builder/?WT.mc_id=DT-MVP-4015686)
-   [DAB Container Registry](https://aka.ms/dab/registry)
-   Videos
    -   [Quick API Endpoints Using Data API Builder - YouTube](https://youtu.be/XQRO_uoGhp4?si=yNoDKZVnC0gEhlNj)
-   DAB Samples
    -   [https://aka.ms/dab/samples/two](https://aka.ms/dab/samples/two)
    -   [https://aka.ms/dab/samples/three](https://aka.ms/dab/samples/three)
-   Other Resources
    -   [SQL Server Management Studio (SSMS)](https://aka.ms/ssms)
    -   [Azure Data Studio](https://aka.ms/azuredatastudio)
-   [Seamless API Development with Data API Builder for your Static Web Apps](https://techcommunity.microsoft.com/t5/educator-developer-blog/seamless-api-development-with-data-api-builder-for-your-static/ba-p/3859712?WT.mc_id=DT-MVP-4015686)
