URL Masking trong Azure APIM

URL Masking là một kỹ thuật quan trọng giúp tăng cường bảo mật cho backend và cải thiện trải nghiệm người dùng khi làm việc với API. Bằng cách che giấu URL, bạn có thể đảm bảo rằng các endpoint nội bộ được ẩn khỏi người dùng bên ngoài nhưng vẫn cung cấp giao diện liền mạch cho người dùng API. Trong bài viết này, chúng ta sẽ khám phá URL Masking trong Azure API Management (APIM) với ví dụ về PetStore API.

Ví dụ

Để demo tính năng URl Masking trong APIM, chúng ta cần 1 api nào đó trả về và chứa URL. Do các API của PetStore không chứa URL trong response, chúng ta sẽ thực hiện việc create 1 pet mới, trong data có URL để data trả về chứa URL như mong muốn.

API PetStore:

https://petstore3.swagger.io/api/v3/openapi.json

Bỏ chọn Supscription trong Settings.

Thực hiện gọi PetStore API để tạo ra 1 pet:

  • API Endpoint: /pet
  • Method: Post
  • Subdomain: nhatkyhoctap
  • URL Suffix: petstore

Để minh họa URL Masking, chúng ta sẽ làm việc với hai ví dụ:

  1. Happy Case: Cập nhật thông tin pet với URL hợp lệ. Thực hiện get /pet để kiểm tra thông tin
  2. Mismatch Case: Cập nhật một URL không khớp với url định nghĩa, dẫn đến url không bị thay thế. Thực hiện get /pet để kiểm tra thông tin

Ví dụ 1

Endpoint backend để cập nhật pet là https://nhatkyhoctap20250127.azure-api.net/petstore/pet. Để đảm bảo response URL được điều chỉnh theo định dạng đã được masking, chúng ta áp dụng policy Mask URLs in Content.

Bước 1:

Sử dụng Postman để thêm data vào API

URL: https://nhatkyhoctap20250127.azure-api.net/petstore/pet

{
  "id": 10,
  "category": {
    "id": 1,
    "name": "string"
  },
  "name": "Tao Thuc",
  "photoUrls": [
    "https://petstore3.swagger.io/api/v3/10.png"
  ],
  "tags": [
    {
      "id": 0,
      "name": "string"
    }
  ],
  "status": "available"
}

Bước 1: Thêm policy để che giấu URL

Trong Azure APIM, chọn API tương ứng với PetStore. Chúng ta sử dụng policy Mark URLs in Content (redirect-content-urls)

URL: https://learn.microsoft.com/en-us/azure/api-management/redirect-content-urls-policy

Scope:

Thêm policy vào Outbound processing:

<!--
    - Policies are applied in the order they appear.
    - Position <base/> inside a section to inherit policies from the outer scope.
    - Comments within policies are not preserved.
-->
<!-- Add policies as children to the <inbound>, <outbound>, <backend>, and <on-error> elements -->
<policies>
    <!-- Throttle, authorize, validate, cache, or transform the requests -->
    <inbound>
        <base />
    </inbound>
    <!-- Control if and how the requests are forwarded to services  -->
    <backend>
        <base />
    </backend>
    <!-- Customize the responses -->
    <outbound>
        <base />
        <redirect-content-urls />
    </outbound>
    <!-- Handle exceptions and customize error responses  -->
    <on-error>
        <base />
    </on-error>
</policies>

Thực hiện GET /pet, reponse sẽ trả về

https://nhatkyhoctap20250127.azure-api.net/petstore/pet/10

{
    "id": 10,
    "category": {
        "id": 1,
        "name": "string"
    },
    "name": "Tao Thuc",
    "photoUrls": [
        "https://nhatkyhoctap20250127.azure-api.net/petstore/10.png"
    ],
    "tags": [
        {
            "id": 0,
            "name": "string"
        }
    ],
    "status": "available"
}

Ví dụ 2

Trong ví dụ này, chúng ta cố tình chỉnh image URL khác đi 1 chút so với Swagger API:

{
  "id": 10,
  "category": {
    "id": 1,
    "name": "string"
  },
  "name": "Tao Thuc",
  "photoUrls": [
    "https://petstore31.swagger.io/api/v3/10.png"
  ],
  "tags": [
    {
      "id": 0,
      "name": "string"
    }
  ],
  "status": "available"
}

Thực hiện lại GET request, URL sẽ không được masking

{
    "id": 10,
    "category": {
        "id": 1,
        "name": "string"
    },
    "name": "Tao Thuc",
    "photoUrls": [
        "https://petstore31.swagger.io/api/v3/10.png"
    ],
    "tags": [
        {
            "id": 0,
            "name": "string"
        }
    ],
    "status": "available"
}

Comment

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *