配置阿里云API Gateway

更新时间:2025-03-26 07:03:29

本文主要介绍如何利用阿里云API网关与M2M技术,严格管控第三方访问权限,从而实现系统间的高效、安全与自动化通信。

前提条件

您在IDAAS中拥有M2M应用的服务端与客户端

image

流程概述

为您的接口实现M2M的认证,实现调用方身份可信且权限可控只需 3 步:

  1. 将接口注册到阿里云的API网关。

  2. 为您的M2MClient授予权限。

  3. 通过API网关中的插件配置将需要保护的接口与M2MClient的权限点绑定。

配置流程

将接口注册到API网关

  1. 登录API 网关,在左侧导航栏,选择API管理 > 分组管理。单击创建分组

    image

  2. 单击后端服务页签下的创建后端服务。该步骤可以将您的业务服务地址注册到阿里云API网关,方便您管理在业务服务的相关API接口。

    image

    1. 需要在创建好的后端服务中绑定您的业务服务地址。

      image

  3. 后端服务创建完成后,需要在后端服务中管理API接口。

    1. 点击上一步创建成功的后端服务后的创建API进入创建API页面。

      image

    2. 在创建API页面中本示例安全认证选择无认证,单击下一步。image

    3. 在定义API请求中填写您的请求路径并选择HTTP Method

      image

    4. 在定义API的后端服务时,需要填写实际的请求路径。调用方在使用过程中,通过调用指定的请求路径,实际请求将被映射到后端的真实路径。

      image

    5. 选择返回ContentType后,完成API的创建操作步骤。

      image

  4. 创建好的API可以在控制台进行调试,以确保接口的正常运行并验证其可用性。

    1. 准备调试的环境,选择接口要发布的环境进行发布。

      image

    2. 选择预发环境的调试,发送请求。在本示例中可看到,返回结果符合预期,接口的可用性验证成功。

      image

M2MClient授予权限

单击进入IDaas云身份控制台,进入您M2MServer应用,在授权应用中找到您的M2M应用Client赋予其权限点。本示例中为Client赋予了user:read:one权限。image

配置API网关插件

配置网关插件,实现请求认证的鉴权功能,并将M2M的权限点与API网关关联起来。该步骤需要创建两个网关插件,分别是JWT鉴权插件参数访问控制插件。

创建JWT鉴权插件

  • 进入API网关控制台在左侧导航栏,选择API管理 > 插件管理在插件管理页面单击创建插件,插件类型选择JWT鉴权image

  • 填写脚本配置的内容。脚本配置中jwk的相关信息需要与M2MServer公钥信息相同。单击进入IDaas云身份控制台,进入您M2MServer应用,复制通用配置验签公钥端点的链接,在浏览器中打开,查看公钥信息。本示例的公钥信息如下:

    控制台中的公钥链接

    image

    在浏览器打开看到的公钥内容

    image

    将获取的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

创建参数访问控制插件

  • 插件类型选择参数访问控制。

    image

  • 填写脚本的内容实现访问控制,以下脚本主要是通过condition实现校验策略。

    右边的脚本以判断clientIdscope为例。

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

    clientIdM2MClient的应用ID。

    scopeM2MClient拥有的权限点。您需要根据您真实的业务情况替代这两个参数。

    ---
    #
    # 在这个例子中假设我们的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接口关联。

    image

验证与使用

完成上述流程后,可以访问M2MServer获取授权token,调用方使用授权token访问业务接口。

获取token

使用Token调用的认证方式:client_secret_post获取token。本示例的操作如下:

  • 复制M2MServerIssuer地址

    image

  • 填入client_secret、client_id、grant_type、scope封装请求。对获取的issuer地址发起请求。

    client_secretM2MClient的应用密钥;

    client_idM2MClient的应用Id;

    grant_type固定值client_credentials;

    scopeM2MServer的受众标识加上权限点,本示例中为https://xxxx.aliyunidaas.com|user:read:one;

    image

API调试

  • 获取的分组详情中的分组二级域名为URL。

    image

  • 获取入参为JWT插件中定义的Token位置及Token参数标识。该示例中入参的keyid_token,value为上一步获取的token

  • 发起请求的结果符合预期。说明该M2MClient有权限可以访问hello接口。

    image

相关文档

  • 本页导读 (1)
  • 配置流程
  • 将接口注册到API网关
  • 为M2MClient授予权限
  • 配置API网关插件
  • 验证与使用
  • 获取token
  • API调试
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等