- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- APIG业务使用流程
- 创建用户并授权使用APIG
- 创建APIG实例
- 开放API
- 配置API调用授权(可选)
- 调用API
-
管理API
- 管理API概述
- 查看或编辑APIG的API信息
- 配置API的自定义认证
- 配置API的参数编排规则
- 自定义API的错误响应信息
- 克隆APIG的API
- 下线APIG的API
- 导入导出API
-
APIG的API设计文件扩展定义
- x-apigateway-auth-type
- x-apigateway-request-type
- x-apigateway-match-mode
- x-apigateway-cors
- x-apigateway-is-send-fg-body-base64
- x-apigateway-any-method
- x-apigateway-backend
- x-apigateway-backend.parameters
- x-apigateway-backend.httpEndpoints
- x-apigateway-backend.httpVpcEndpoints
- x-apigateway-backend.functionEndpoints
- x-apigateway-backend.mockEndpoints
- x-apigateway-backend-policies
- x-apigateway-backend-policies.conditions
- x-apigateway-ratelimit
- x-apigateway-ratelimits
- x-apigateway-ratelimits.policy
- x-apigateway-ratelimits.policy.special
- x-apigateway-access-control
- x-apigateway-access-controls
- x-apigateway-access-controls.policy
- x-apigateway-plugins
- x-apigateway-auth-opt
- x-apigateway-result-normal-sample
- x-apigateway-result-failure-sample
- x-apigateway-authorizer
- x-apigateway-response
- x-apigateway-responses
- x-apigateway-pass-through
- x-apigateway-sample
- x-apigateway-content-type
- x-apigateway-orchestrations
- 配置API策略
- 配置凭据策略
- 管理APIG实例
- 查看监控指标与配置告警
- 查看APIG审计日志
- 共享版操作指导(仅存量用户使用)
- 最佳实践
- 开发指南
-
API参考
- 使用前必读
- API概览
- 如何调用API
-
专享版API(V2)
- 专享版-API分组管理
- 专享版-环境管理
- 专享版-环境变量管理
- 专享版-流控策略管理
- 专享版-API管理
- 专享版-签名密钥管理
- 专享版-签名密钥绑定关系管理
- 专享版-API绑定流控策略
- 专享版-设置特殊流控
- 专享版-APP授权管理
- 专享版-概要查询
- 专享版-域名管理
- 专享版-ACL策略管理
- 专享版-API绑定ACL策略
- 专享版-自定义认证管理
- 专享版-OpenAPI接口
- 专享版-VPC通道管理
- 专享版-监控信息查询
- 专享版-分组自定义响应管理
- 专享版-标签管理
- 专享版-实例特性管理
- 专享版-配置管理
- 专享版-实例管理
- 专享版-实例终端节点管理
- 专享版-实例标签管理
- 专享版-微服务中心管理
- 专享版-SSL证书管理
- 专享版-插件管理
- 专享版-凭据管理
- 专享版-凭据配额管理
- 专享版-异步任务管理
- 专享版-编排规则管理
- 专享版-实例自定义入方向端口管理
- 共享版API(仅存量用户使用)
- 专享版API(V1)(待下线)
- 权限策略和授权项
- 附录
- 修订记录
- SDK参考
- 场景代码示例
-
常见问题
- 热门咨询
- 产品咨询
- 开放API
- 发布API
-
调用API
- 调用API失败的可能原因
- 调用API报“414 Request URI too large”
- 调用API报“The API does not exist or has not been published in the environment”
- 调用API报“No backend available”
- API的后端服务报“Backend unavailable”或“Backend timeout”
- API的后端服务报“Backend domain name resolution failed”
- 调用API报“Incorrect IAM authentication information”
- 调用API报“Incorrect app authentication information”
- 修改API后端服务的超时时间上限“backend_timeout”后未生效
- APIG对API请求体的大小是否有限制?
- API调用对请求的响应消息体限制
- 使用iOS系统时,如何使用APP认证调用API?
- 新建一个华为IAM认证方式的API,在配置入参时为什么无法配置HEADER位置的x-auth-token?
- 是否支持移动应用调用API?
- 部署在VPC下的应用是否可以调用API?
- APIG是否支持WebSocket数据传输?
- API的策略后端有多个时,怎么匹配和执行API请求?
- 如何通过APIG访问公网后端服务?
- API认证
- API策略
- 导入导出API
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
配置API的前端自定义认证
如果您需要把自己的认证系统用于API调用的认证鉴权,可以使用自定义认证来实现。
自定义认证包括前端和后端两种类型:
- 前端自定义认证:指APIG使用自定义的认证函数,对收到的API请求进行安全认证。
- 后端自定义认证:指API的后端服务使用自定义的认证函数,对来自APIG转发的后端服务请求进行安全认证。
本章节主要介绍如何创建一个前端自定义认证。您需要先创建一个函数后端作为认证函数,并在自定义认证中使用该函数后端作为认证后端。

使用自定义认证调用API的流程如下图所示:

约束与限制
自定义认证依赖函数服务。如果当前Region没有上线函数服务,则不支持使用自定义认证。
创建用于前端自定义认证的函数
在使用前端自定义认证对前端请求进行认证鉴权前,您需要先在FunctionGraph创建一个函数,通过函数定义您所需的认证信息。
- 进入FunctionGraph控制台。
- 在左侧导航栏中选择“函数 > 函数列表”。
- 单击“创建函数”,根据下表参数说明,创建一个函数。
表1 配置函数 参数
说明
选择创建方式
默认“创建空白函数”。
函数类型
选择函数的类型,此处默认“事件函数”。
区域
选择与API网关相同区域。
项目
华为云的区域默认对应一个项目,这个项目由系统预置,用来隔离物理区域间的资源(计算资源、存储资源和网络资源),以默认项目为单位进行授权,用户可以访问您账号中该区域的所有资源。此处默认为已选择的区域。
函数名称
根据规划自定义名称。建议您按照一定的命名规则填写名称,方便您快速识别和查找。
企业项目
企业项目是项目的升级版,针对企业不同项目间资源的分组和管理,是逻辑隔离。此处默认“default”。
委托名称
用户委托函数工作流去访问其他的云服务。此处选择“未使用任何委托”。
运行时
此处以python2.7语言为例。
- 单击“创建函数”。
- 函数创建完成后,进入函数详情。在“代码”页签中设置函数代码。
函数代码需要满足如下条件:
- 函数代码支持三种请求参数定义,格式为:
- Header中的请求参数:event["headers"]["参数名"]
- Query中的请求参数:event["queryStringParameters"]["参数名"]
- 您自定义的用户数据:event["user_data"]
- 函数代码获取的三种请求参数与API网关自定义认证中的参数关系如下所示:
- Header中的请求参数:对应自定义认证中参数位置为Header的身份来源,其参数值在您调用使用该前端自定义认证的API时传入
- Query中的请求参数:对应自定义认证中参数位置为Query的身份来源,其参数值在您调用使用该前端自定义认证的API时传入
- 您自定义的用户数据:对应自定义认证中的用户数据,其参数值在您创建自定义认证时输入
- 函数的返回值不能大于1M,必须满足如下格式:
{ "statusCode":200, "body": "{\"status\": \"allow\", \"context\": {\"user\": \"abc\"}}" }
其中,body字段的内容为字符串格式,json解码之后为:
{ "status": "allow/deny", "context": { "user": "abc" } }
- “statusCode”字段为必选,函数服务正常且自定义认证函数代码符合规范时,statusCode的值则为自定义认证函数的响应码。
- 调用自定义认证的API,当自定义认证函数的响应码为非200时,API网关认为函数服务异常,并返回错误码“500”,错误信息为“Internal server error”。
- 调用自定义认证的API,如果自定义认证开启宽松模式,当自定义认证函数连接失败、返回“500”或者“503”时,自定义认证不会校验body字段里面的status字段,直接返回调用成功,同时从函数代码中获取到的context字段也为空。
- “status”字段为必选,用于标识认证结果。只支持“allow”或“deny”,“allow”表示认证成功,“deny”表示认证失败。
- “context”字段为可选,支持字符串类型键值对,当实例支持authorizer_context_support_num_bool特性时,键值对的值支持number类型或boolean类型,键值不支持JSON对象或数组。
context中的数据为您自定义的字段,认证通过后作为认证参数映射到API网关后端参数中,其中context中的参数名称与系统参数名称必须完全一致,且区分大小写,context中的参数名称必须以英文字母开头,支持英文大小写字母、数字、下划线和中划线,且长度为1~32个字符。
前端认证通过后,context中的user的值abc映射到后端服务Header位置的test参数中。
- “statusCode”字段为必选,函数服务正常且自定义认证函数代码符合规范时,statusCode的值则为自定义认证函数的响应码。
Header中的请求参数定义代码示例:
# -*- coding:utf-8 -*- import json def handler(event, context): if event["headers"].get("test")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"abcd" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp)
Query中的请求参数定义代码示例:
# -*- coding:utf-8 -*- import json def handler(event, context): if event["queryStringParameters"].get("test")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"abcd" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp)
用户数据定义代码示例:
# -*- coding:utf-8 -*- import json def handler(event, context): if event.get("user_data")=='abc': resp = { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user":"abcd" } }) } else: resp = { 'statusCode': 200, 'body': json.dumps({ "status":"deny", }) } return json.dumps(resp)
- 函数代码支持三种请求参数定义,格式为:
- 测试函数。在测试事件的“事件模板”中选择“apig-event-template”,根据实际情况修改后保存测试模板,单击“测试”。
执行结果为“成功”时,表示测试成功。
接下来您需要进入API网关界面创建前端自定义认证。
创建前端自定义认证
在创建前端自定义认证前,请确保已有用于前端自定义认证的函数后端,否则请提前创建用于前端自定义认证的函数。
- 进入API网关控制台页面。
- 根据实际业务在左侧导航栏上方选择实例。
- 在左侧导航栏选择“API管理 > API策略”。
- 在“自定义认证”页面,单击“创建自定义认证”。根据下表参数说明,配置自定义认证参数。
表2 自定义认证参数说明 参数
说明
认证名称
填写自定义的认证名称,用于区分不同的自定义认证。支持中文、英文、数字、下划线,只能以中文或英文开头,长度为3~64个字符。
类型
创建前端自定义认证时,选择“前端”。
函数地址
选择用于前端自定义认证的函数后端,仅可以选择状态为“已部署”的函数后端。
版本或别名
选择函数的版本或别名,函数的版本或别名功能请参考《函数工作流 FunctionGraph用户指南》。
缓存时间(秒)
设置认证结果缓存的时间。
取值范围为0s~3600s,值为0时代表不缓存,最大支持3600s。
宽松模式
- 开关开启后,当函数服务不可用(与函数服务建立连接失败或者函数服务返回5xx)时,API网关仍然接受客户端请求。如果有重试请求,以最后一次返回结果为准。
- 开关开启后,如果API的后端认证使用了自定义认证,那么后端认证参数获取到的值为空。
开启宽松模式存在安全风险,请谨慎操作。
身份来源
设置用于认证的请求参数。
当“缓存时间”不为0时,必须设置此参数。使用缓存时,此参数将作为搜索条件来查询认证结果。
是否发送body
指是否将API请求的body体内容传递给认证函数。body体内容传给函数的方式,与header、query内容传递一致。
用户数据
自定义的请求参数,APIG调用函数时,与“身份来源”一同作为请求参数。长度为1~2048个字符。
- 单击“确定”,完成自定义认证的创建。