使用函数服务开发自定义认证
简介
本手册基于华为云API网关实践所编写,用于指导如何为API添加自定义认证。
在API的安全认证方面,API网关提供IAM认证、APP认证等方式,帮助用户快速开放API,同时API网关也支持用户使用自己的认证方式(以下简称自定义认证),以便更好地兼容已有业务能力。
API网关支持的自定义认证需要借助函数工作流服务实现,用户在函数工作流中创建自定义认证函数,API网关调用该函数,实现自定义认证。下面以Basic认证为例,介绍如何使用函数服务实现自定义认证。
编写自定义认证函数
在函数工作流的控制台编写函数,自定义认证的代码编写指南参见创建用于前端自定义认证的函数。
在函数工作流页面创建一个函数,语言选Python 3.6。
参数 |
配置说明 |
---|---|
函数类型 |
默认“事件函数”。 |
区域 |
与API网关相同区域。 |
项目 |
华为云的区域默认对应一个项目,这个项目由系统预置,用来隔离物理区域间的资源(计算资源、存储资源和网络资源),以默认项目为单位进行授权,用户可以访问您账号中该区域的所有资源。此处默认为已选择的区域。 |
函数名称 |
根据规划自定义名称。建议您按照一定的命名规则填写名称,方便您快速识别和查找。 |
企业项目 |
企业项目是项目的升级版,针对企业不同项目间资源的分组和管理,是逻辑隔离。此处默认“default”。 |
委托名称 |
用户委托函数工作流去访问其他的云服务。此处选择“未使用任何委托”。 |
运行时 |
选择Python 3.6。 |
函数创建完成后,进入函数详情。在“代码”页签,将以下代码复制到index.py中(如果您使用的是专享版网关,并且实例支持authorizer_context_support_num_bool特性,那么context中的value的类型可以为boolean类型或number类型)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# -*- coding:utf-8 -*- import json def handler(event, context): #以下表示认证信息匹配正确,则返回用户名, if event["headers"]["authorization"]=='Basic dXN****cmQ=': return { 'statusCode': 200, 'body': json.dumps({ "status":"allow", "context":{ "user_name":"user1" } }) } else: return { 'statusCode': 200, 'body': json.dumps({ "status":"deny", "context":{ "code": "1001", "message":"incorrect username or password", "authorizer_success": "false" } }) } |
创建自定义认证
在API网关控制台页面,创建自定义认证,类型选择“前端”,函数地址选择上一步创建的函数。
创建自定义认证的API
创建API,具体步骤请参见创建API。将“安全认证”修改为“自定义认证”,并选择上一步创建的自定义认证。编辑完成之后发布API。
设置错误响应
调用API如果输入错误的认证信息,则返回结果如下:
1
|
{"error_msg":"Incorrect authentication information: frontend authorizer","error_code":"APIG.0305","request_id":"36e42b3019077c2b720b6fc847733ce9"} |
为了让API响应结果为函数中返回的context中的字段(如果您使用的是专享版网关,并且实例支持authorizer_context_support_num_bool特性,那么context中的value的类型可以为boolean类型或number类型),需要修改网关响应模板。在API所在的分组中,“分组信息”页签下的“网关响应”区域,编辑自定义认证失败的响应详情,将响应状态码改为401,将消息模板改为(引用变量为boolean类型或number类型时,变量不需要加双引号):
1
|
{"code":"$context.authorizer.frontend.code","message":"$context.authorizer.frontend.message", "authorizer_success": "$context.authorizer.frontend.authorizer_success"} |
修改之后,调用API传入错误的认证信息,返回状态码为401,返回结果如下:
1
|
{"code":"1001","message":"incorrect username or password","authorizer_success": "false"} |
映射后端参数
如果认证通过,函数返回的context信息,可以传到后端,配置方式如下:
编辑API,在后端服务页面,添加系统参数,参数类型为前端认证参数,系统参数名称填自定义认证函数中context中的字段,后端参数名称和位置填需要传入到后端请求的参数名和位置。
编辑和发布完成之后,使用正确的认证信息调用API,可以看到后端打印了X-User-Name头,值为函数代码中写入到context中的user_name字段的用户名。