API网关 APIG-创建用于前端自定义认证的函数:操作步骤
操作步骤
- 在FunctionGraph中开发函数。
下面以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网关APIG-华为云
- API网关基本概念_云原生API网关_API网关APIG-华为云
- 什么是API网关_API网关有什么作用_API网关APIG-华为云
- 华为GaussDB自定义函数_GaussDB教程_华为高斯数据库自定义函数
- API网关有哪些使用场景_API网关作用_API网关APIG-华为云
- GaussDB数据库自定义函数_GaussDB 华为_高斯数据库自定义函数
- 使用FunctionGraph构建自己的ChatGPT_函数工作流_华为云FunctionGraph-华为云
- API网关流量控制策略_流量管控_API网关APIG-华为云
- 如何使用模板创建函数_模板创建函数_函数工作流 FunctionGraph-华为云
- API网关的优势_API网关的应用场景_APIG产品术语