本文主要介绍如何利用阿里云API网关与M2M技术,严格管控第三方访问权限,从而实现系统间的高效、安全与自动化通信。
前提条件
您在IDAAS中拥有M2M应用的服务端与客户端
流程概述
为您的接口实现M2M的认证,实现调用方身份可信且权限可控只需 3 步:
将接口注册到阿里云的API网关。
为您的M2MClient授予权限。
通过API网关中的插件配置将需要保护的接口与M2MClient的权限点绑定。
配置流程
将接口注册到API网关
登录API 网关,在左侧导航栏,选择 。单击创建分组。
单击后端服务页签下的创建后端服务。该步骤可以将您的业务服务地址注册到阿里云API网关,方便您管理在业务服务的相关API接口。
需要在创建好的后端服务中绑定您的业务服务地址。
后端服务创建完成后,需要在后端服务中管理API接口。
点击上一步创建成功的后端服务后的创建API进入创建API页面。
在创建API页面中本示例安全认证选择无认证,单击下一步。
在定义API请求中填写您的请求路径并选择HTTP Method。
在定义API的后端服务时,需要填写实际的请求路径。调用方在使用过程中,通过调用指定的请求路径,实际请求将被映射到后端的真实路径。
选择返回ContentType后,完成API的创建操作步骤。
创建好的API可以在控制台进行调试,以确保接口的正常运行并验证其可用性。
准备调试的环境,选择接口要发布的环境进行发布。
选择预发环境的调试,发送请求。在本示例中可看到,返回结果符合预期,接口的可用性验证成功。
为M2MClient授予权限
单击进入IDaas云身份控制台,进入您M2M的Server应用,在授权应用中找到您的M2M应用Client赋予其权限点。本示例中为Client赋予了user:read:one权限。
配置API网关插件
配置网关插件,实现请求认证的鉴权功能,并将M2M的权限点与API网关关联起来。该步骤需要创建两个网关插件,分别是JWT鉴权插件与参数访问控制插件。
创建JWT鉴权插件
进入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地址
填入client_secret、client_id、grant_type、scope封装请求。对获取的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访问配置流程。
- 本页导读 (1)
- 配置流程
- 将接口注册到API网关
- 为M2MClient授予权限
- 配置API网关插件
- 验证与使用
- 获取token
- API调试
- 相关文档