全部產品
Search
文件中心

Identity as a Service:配置阿里雲API Gateway

更新時間:Sep 27, 2025

本文主要介紹如何利用阿里雲API Gateway與M2M技術,嚴格管控第三方存取權限,從而實現系統間的高效、安全與自動化通訊。

前提條件

您在IDaaS中擁有M2M應用的服務端與用戶端

流程概述

為您的介面實現M2M的認證,實現調用方身份可信且許可權可控只需 3 步:

  1. 將介面註冊到阿里雲的API Gateway。

  2. 為您的M2MClient授予許可權。

  3. 通過API Gateway中的外掛程式配置將需要保護的介面與M2MClient的許可權點綁定。

配置流程

將介面註冊到API Gateway

  1. 登入API Gateway,在左側導覽列,選擇API管理 > 分組管理。單擊建立分組

  2. 單擊後端服務頁簽下的建立後端服務。該步驟可以將您的商務服務地址註冊到阿里雲API Gateway,方便您管理在商務服務的相關API介面。

    1. 需要在建立好的後端服務中綁定您的商務服務地址。

  3. 後端服務建立完成後,需要在後端服務中管理API介面。

    1. 點擊上一步建立成功的後端服務後的建立API進入建立API頁面。

    2. 在建立API頁面中本樣本安全認證選擇無認證,單擊下一步。

    3. 在定義API請求中填寫您的請求路徑並選擇HTTP Method

    4. 在定義API的後端服務時,需要填寫實際的請求路徑。調用方在使用過程中,通過調用指定的請求路徑,實際請求將被映射到後端的真實路徑。

    5. 選擇返回ContentType後,完成API的建立操作步驟。

  4. 建立好的API可以在控制台進行調試,以確保介面的正常運行並驗證其可用性。

    1. 準備調試的環境,選擇介面要發布的環境進行發布。

    2. 選擇預發環境的調試,發送請求。在本樣本中可看到,返回結果符合預期,介面的可用性驗證成功。

為M2MClient授予許可權

單擊進入IDaas雲身份控制台,進入您M2M的Server應用,在授權應用中找到您的M2M應用Client賦予其許可權點。本樣本中為Client賦予了user:read:one許可權。

配置API Gateway外掛程式

配置網關外掛程式,實現請求認證的鑒權功能,並將M2M的許可權點與API Gateway關聯起來。該步驟需要建立兩個網關外掛程式,分別是JWT鑒權外掛程式參數存取控制外掛程式。

建立JWT鑒權外掛程式

  • 進入API Gateway控制台在左側導覽列,選擇API管理 > 外掛程式管理在外掛程式管理頁面單擊建立外掛程式,外掛程式類型選擇JWT鑒權

  • 填寫指令碼配置的內容。指令碼配置中jwk的相關資訊需要與M2M的Server公開金鑰資訊相同。單擊進入IDaas雲身份控制台,進入您M2M的Server應用,複製通用配置驗簽公開金鑰端點的連結,在瀏覽器中開啟,查看公開金鑰資訊。本樣本的公開金鑰資訊如下:

    控制台中的公開金鑰連結

    在瀏覽器開啟看到的公開金鑰內容

    將擷取的jwt公開金鑰資訊替換以下內容中的jwk

    替換前的指令碼配置

    ---
    parameter: id_token         # 從指定的參數中擷取JWT, 對應API的參數
    parameterLocation: query  # API為映射模式時可選, API為透傳模式下必填, 用於指定JWT的讀取位置, 僅支援`query`,`header`
    bypassEmptyToken: false    # 當`jwt`為空白時是否允許驗證通過
    claimParameters:           # claims參數轉換, 網關會將jwt claims映射為後端參數
    - claimName: aud           # claim名稱,支援公用和私人
      parameterName: aud     # 映射後參數名稱
      location: query         # 映射後參數位置, 支援`query,header,path,formData`
    - claimName: scope        # claim名稱,支援公用和私人
      parameterName: scope    # 映射後參數名稱
      location: query          # 映射後的參數位置, 支援`query,header,path,formData`
    - claimName: client_id      # claim名稱,支援公用和私人
      parameterName: client_id  # 映射後參數名稱
      location: query          # 映射後的參數位置, 支援`query,header,path,formData`
    preventJtiReplay: false    # 是否開啟針對`jti`的防重放檢查, 預設: false
    #
    # 以下為需要替換的內容
    jwk:
      kty: RSA
      e: AQAB
      use: sig
      kid: O8fpdhrViq2zaaaBEWZITz 	# 在只配置一個JWK時,kid是可選的,但如果中JWT包含了kid,網關會校正kid的一致性
      alg: RS256
      n: qSVxcknOm0uCq5vGsOmaorPDzHUubBmZZ4UXj-9do7w9X1uKFXAnqfto4TepSNuYU2bA_-tzSLAGBsR-BqvT6w9SjxakeiyQpVmexxnDw5WZwpWenUAcYrfSPEoNU-0hAQwFYgqZwJQMN8ptxkd0170PFauwACOx4Hfr-9FPGy8NCoIO4MfLXzJ3mJ7xqgIZp3NIOGXz-GIAbCf13ii7kSStpYqN3L_zzpvXUAos1FJ9IPXRV84tIZpFVh2lmRh0h8ImK-vI42dwlD_hOIzayL1Xno2R0T-d5AwTSdnep7g-Fwu8-sj4cCRWq3bd61Zs2QOJ8iustH0vSRMYdP5oYQ

    替換後的指令碼配置

    ---
    parameter: id_token         # 從指定的參數中擷取JWT, 對應API的參數
    parameterLocation: query  # API為映射模式時可選, API為透傳模式下必填, 用於指定JWT的讀取位置, 僅支援`query`,`header`
    bypassEmptyToken: false    # 當`jwt`為空白時是否允許驗證通過
    claimParameters:           # claims參數轉換, 網關會將jwt claims映射為後端參數
    - claimName: aud           # claim名稱,支援公用和私人
      parameterName: aud     # 映射後參數名稱
      location: query         # 映射後參數位置, 支援`query,header,path,formData`
    - claimName: scope        # claim名稱,支援公用和私人
      parameterName: scope    # 映射後參數名稱
      location: query          # 映射後的參數位置, 支援`query,header,path,formData`
    - claimName: client_id      # claim名稱,支援公用和私人
      parameterName: client_id  # 映射後參數名稱
      location: query          # 映射後的參數位置, 支援`query,header,path,formData`
    preventJtiReplay: false    # 是否開啟針對`jti`的防重放檢查, 預設: false
    #
    # `Json Web Key`的`Public Key`
    jwk:
      kty: RSA
      e: AQAB
      use: sig
      kid: AUTHSKEY7Ph6QS83xkN76oRwvZsJT68ejJ4PdAXmk 	# 在只配置一個JWK時,kid是可選的,但如果中JWT包含了kid,網關會校正kid的一致性
      alg: RS256
      n: i1tIYhXvfilaJi8kaIS8EpgsnDp6G4c1lEg2qRD_-1lY8jOIWAVcetq89itl7rjFJ9gmbKGBMJoutaxGHtbAkY0aINkg1_n_0NnNTZDt2UC1UNJaZh12bkYyubRLA_t6JS8PVSr5bpse1SErvDiumqU9CjxBUCd4K8R0ALxOwup6yY5gVT4Juia1bEVGPlJ-RnuMvXXbVmwuklKTiWNfBFw1lCDPftfzKVEDTXt4VphAWOT-CyZKJ8hcYiTnd_VaAYxjMQSCxmE-utrdXGhyDUaQobs0myvD2eJfzcSWG-qOTC7Hin8bvXIQ_v9BkJO3D6uoLpB14XQozWVTXaPTIw

建立參數存取控制外掛程式

  • 外掛程式類型選擇參數存取控制。

  • 填寫指令碼的內容實現存取控制,以下指令碼主要是通過condition實現校正策略。

    右邊的指令碼以判斷clientId與scope為例。

    condition: "$clientId = 'app_m7hfgn66xkyyxlhpkiw5kjenhy' and $scope like '%user:read:one%'"

    clientId為M2MClient的應用ID。

    scope為M2MClient擁有的許可權點。您需要根據您真實的業務情況替代這兩個參數。

    ---
    #
    # 在這個例子中假設我們的API請求Path為`/{userId}/...`,
    # API使用JWT認證,JWT中有userId和userType兩個claim
    # 我們這個外掛程式的校正條件為
    # - 當userType=admin時,允許所有的路徑,
    # - 當userType=user時,僅允許/{userId}路徑一致的請求
    parameters:
      scope: "Token:scope"
      clientId: "Token:client_id"
    #
    # 關於Rules的處理規則,依次演算條件,按照傳回值為`true`或者`false`,處理`ifTrue`的邏輯或`ifFalse`的結果
    # `ALLOW`會直接判斷為成功,而`DENY`則會直接返回錯誤碼給用戶端,
    # 如果沒有觸發`ALLOW`或`DENY`邏輯,則執行下一條
    rules:
      - name: checkScope
        condition: "$clientId = 'app_m7hfgn66xkyyxlhpkiw5kjenhy' and $scope like '%user:read:one%'"
        ifFalse: "DENY"
        statusCode: 403
        errorMessage: "No permission by client id: ${clientId}"
        responseHeaders:
          Content-Type: application/json
          X-IDaaS-clientId: ${clientId}
          X-IDaaS-scope: ${scope}
        responseBody: |
          <Reason>No permission by client id: ${clientId}</Reason>

外掛程式綁定API

兩個外掛程式建立完成後,需要將外掛程式與API介面關聯,實現許可權點與API介面的映射關係。本樣本中通過外掛程式與介面的關聯,user:read:one許可權點可以控制hello介面的訪問。

  • 依次選擇建立的兩個外掛程式操作列的綁定API,將外掛程式與API介面關聯。

驗證與使用

完成上述流程後,可以訪問M2MServer擷取授權token,調用方使用授權token訪問業務介面。

擷取token

使用Token調用的認證方式:client_secret_post擷取token。本樣本的操作如下:

  • 複製M2MServer的 Issuer 地址。

  • 填入以下請求參數,對擷取的 Issuer 地址發起請求。

    參數項

    說明

    client_secret

    M2MClient的應用密鑰。

    client_id

    M2MClient的應用Id。

    grant_type

    固定值client_credentials。

    scope

    M2MServer的受眾標識加上許可權點,本樣本中為:https://xxxx.aliyunidaas.com|user:read:one

API調試

  • 擷取的分組詳情中的分組次層網域為URL。

  • 擷取入參為JWT外掛程式中定義的Token位置及Token參數標識。該樣本中入參的key為id_token,value為上一步擷取的token

  • 發起請求的結果符合預期。說明該M2MClient有許可權可以訪問hello介面。

相關文檔