在我们的示例方案中,主应用程序使用使用访问密钥进行保护的第三方 API。 本部分演示了使用 Azure Functions 的 API,但不管 API 的实现方式或位置如何,都适用相同的原则,无论是在另一个云提供商还是传统 Web 服务器上托管应用程序。
关键方面是,对受保护终结点的任何客户端请求都必须包含访问密钥,应用必须安全地管理该密钥。 本部分概述了如何使用 Azure Functions 实现此类 API,但你可以根据具体需求调整原则。
第三方 API 实现示例
示例第三方 API 是一个简单的终结点,它返回介于 1 和 999 之间的随机数。 API 使用访问密钥进行保护,必须在请求中提供该密钥才能访问终结点。 出于演示目的,此 API 部署到终结点 https://msdocs-example-api.azurewebsites.net/api/RandomNumber
。 但是,若要调用 API,您必须在d0c5atM1cr0s0ft
URL 参数中或 HTTP 标头的?code=
属性中提供访问密钥'x-functions-key'
。 例如,在部署应用和 API 后,请在浏览器或 curl 中尝试此 URL: https://msdocs-example-api.azurewebsites.net/api/RandomNumber?code=d0c5atM1cr0s0ft
。
如果访问密钥有效,终结点将返回包含单个属性“value”的 JSON 响应,其值为介于 1 和 999 之间的数字,例如 {"value": 959}
。
终结点在 Python 中实现,并部署到 Azure Functions。 代码如下所示:
import logging
import random
import json
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('RandomNumber invoked via HTTP trigger.')
random_value = random.randint(1, 1000)
dict = { "value" : random_value }
return func.HttpResponse(json.dumps(dict))
在示例存储库中,此代码位于 third_party_api/RandomNumber/__init__.py 下。 该文件夹 RandomNumber 提供函数的名称, __init__.py 包含代码。 文件夹中的另一个文件 ,function.json,描述何时触发函数。 third_party_api父文件夹中的其他文件提供了托管函数本身的 Azure 函数应用的详细信息。
若要部署代码,示例的预配脚本将执行以下步骤:
使用 Azure CLI 命令为 Azure Functions 创建备份存储帐户,
az storage account create
用于管理状态和内部操作。使用 Azure CLI 命令
az function app create
创建 Azure Functions 应用。等待 60 秒以完全预配主机后,使用 Azure Functions Core Tools 命令
func azure functionapp publish
部署代码。将访问密钥
d0c5atM1cr0s0ft
分配给函数。 (有关函数密钥的背景信息,请参阅 保护 Azure Functions 。在预配脚本中,此步骤是使用 az functionapp function keys set Azure CLI 命令完成的。
包括注释,以显示如何通过 REST API 调用 函数密钥管理 API (如果需要)。 若要调用该 REST API,必须先执行另一个 REST API 调用才能检索函数应用的主密钥。
还可以通过 Azure 门户分配访问密钥。 在 Functions 应用的页面上,选择 “Functions”,然后选择要保护的特定函数(在本示例中命名 RandomNumber
)。 在函数的页面上,选择 “函数密钥 ”以打开可在其中创建和管理这些密钥的页面。