文档首页> API网关 APIG> 最佳实践> 使用函数服务开发自定义认证
更新时间:2024-04-02 GMT+08:00

使用函数服务开发自定义认证

简介

本手册基于华为云API网关实践所编写,用于指导如何为API添加自定义认证。

在API的安全认证方面,API网关提供IAM认证、APP认证等方式,帮助用户快速开放API,同时API网关也支持用户使用自己的认证方式(以下简称自定义认证),以便更好地兼容已有业务能力。

API网关支持的自定义认证需要借助函数工作流服务实现,用户在函数工作流中创建自定义认证函数,API网关调用该函数,实现自定义认证。下面以Basic认证为例,介绍如何使用函数服务实现自定义认证。

编写自定义认证函数

在函数工作流的控制台编写函数,自定义认证的代码编写指南参见创建用于前端自定义认证的函数

在函数工作流页面创建一个函数,语言选Python 3.6。

表1 函数信息配置

参数

配置说明

函数类型

默认“事件函数”。

区域

与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"}

2

修改之后,调用API传入错误的认证信息,返回状态码为401,返回结果如下:

1
 {"code":"1001","message":"incorrect username or password","authorizer_success": "false"}

映射后端参数

如果认证通过,函数返回的context信息,可以传到后端,配置方式如下:

编辑API,在后端服务页面,添加系统参数,参数类型为前端认证参数,系统参数名称填自定义认证函数中context中的字段,后端参数名称和位置填需要传入到后端请求的参数名和位置。

编辑和发布完成之后,使用正确的认证信息调用API,可以看到后端打印了X-User-Name头,值为函数代码中写入到context中的user_name字段的用户名。