本文主要介紹如何利用阿里雲API Gateway與M2M技術,嚴格管控第三方存取權限,從而實現系統間的高效、安全與自動化通訊。
前提條件
您在IDaaS中擁有M2M應用的服務端與用戶端
流程概述
為您的介面實現M2M的認證,實現調用方身份可信且許可權可控只需 3 步:
將介面註冊到阿里雲的API Gateway。
為您的M2MClient授予許可權。
通過API Gateway中的外掛程式配置將需要保護的介面與M2MClient的許可權點綁定。
配置流程
將介面註冊到API Gateway
登入API Gateway,在左側導覽列,選擇。單擊建立分組。
單擊後端服務頁簽下的建立後端服務。該步驟可以將您的商務服務地址註冊到阿里雲API Gateway,方便您管理在商務服務的相關API介面。
需要在建立好的後端服務中綁定您的商務服務地址。
後端服務建立完成後,需要在後端服務中管理API介面。
點擊上一步建立成功的後端服務後的建立API進入建立API頁面。
在建立API頁面中本樣本安全認證選擇無認證,單擊下一步。
在定義API請求中填寫您的請求路徑並選擇HTTP Method。
在定義API的後端服務時,需要填寫實際的請求路徑。調用方在使用過程中,通過調用指定的請求路徑,實際請求將被映射到後端的真實路徑。
選擇返回ContentType後,完成API的建立操作步驟。
建立好的API可以在控制台進行調試,以確保介面的正常運行並驗證其可用性。
準備調試的環境,選擇介面要發布的環境進行發布。
選擇預發環境的調試,發送請求。在本樣本中可看到,返回結果符合預期,介面的可用性驗證成功。
為M2MClient授予許可權
單擊進入IDaas雲身份控制台,進入您M2M的Server應用,在授權應用中找到您的M2M應用Client賦予其許可權點。本樣本中為Client賦予了user:read:one許可權。
配置API Gateway外掛程式
配置網關外掛程式,實現請求認證的鑒權功能,並將M2M的許可權點與API Gateway關聯起來。該步驟需要建立兩個網關外掛程式,分別是JWT鑒權外掛程式與參數存取控制外掛程式。
建立JWT鑒權外掛程式
進入API Gateway控制台,在左側導覽列,選擇。在外掛程式管理頁面單擊建立外掛程式,外掛程式類型選擇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介面。
相關文檔
瞭解M2M應用(機器間許可權管理)的功能原理。
結合阿里雲RAM實現無AK訪問配置流程。