使用 Azure Functions 生成身份验证服务

本文介绍如何使用 Azure Functions 生成受信任的用户访问服务。

重要

本教程中创建的终结点不安全。 请务必阅读 Azure Functions 安全 文章中的安全详细信息。 需要向终结点添加安全措施,以确保恶意操作者无法发行令牌。

本文介绍如何:

  • 设置函数。
  • 生成访问令牌。
  • 测试函数。
  • 部署并运行函数。

下载代码

GitHub 上查找此快速入门的最终代码。

先决条件

概述

显示受信任服务架构的图表。

在本教程中,你将创建一个充当受信任的令牌预配服务的函数应用。 你可以使用本教程来启动自己的令牌预配服务。

此服务负责向通信服务验证用户。 通信服务应用程序的用户需要访问令牌才能参与聊天线程和 VoIP 呼叫。 该函数充当用户与通信服务之间的受信任中间人。 可以在不向用户公开资源连接字符串的情况下预配访问令牌。

有关详细信息,请参阅客户端-服务器体系结构以及身份验证和授权概念文档。

设置函数

本部分介绍设置函数的过程。

Azure Functions 设置

让我们首先为函数设置基本结构。 有关设置的分步说明,请参阅 快速入门:使用 Visual Studio Code 在 Azure 中创建 C# 函数

该函数需要以下配置:

  • 语言:JavaScript
  • 模板:HTTP 触发器
  • 授权级别:匿名(如果你更喜欢其他授权模型,可以稍后切换)
  • 函数名称:用户定义的

完成遵循《快速入门:使用 Visual Studio Code 在 Azure 中创建 C# 函数》中说明并配置后,您应该在 Visual Studio Code 中拥有一个项目,其中包含函数本身的 index.js 文件。 文件中的以下代码应为:


module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    const name = (req.query.name || (req.body && req.body.name));
    const responseMessage = name
        ? "Hello, " + name + ". This HTTP triggered function executed successfully."
        : "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.";

    context.res = {
        // status: 200, /* Defaults to 200 */
        body: responseMessage
    };
}

下一步是安装通信服务库。

安装通信服务库

使用 Identity 库生成用户访问令牌。

使用 npm install 命令来安装 JavaScript 的通信服务身份 SDK。


npm install @azure/communication-identity --save

--save 选项在 package.json 文件中列出作为依赖项的库。

index.js 文件的顶部,导入 CommunicationIdentityClient 这个参数的接口。

const { CommunicationIdentityClient } = require('@azure/communication-identity');

生成访问令牌

若要允许函数生成用户访问令牌,首先需要为通信服务资源使用连接字符串。

有关如何检索连接字符串的详细信息,请参阅 快速入门:创建和管理通信服务资源

const connectionString = 'INSERT YOUR RESOURCE CONNECTION STRING'

接下来,修改原始函数以生成用户访问令牌。

若要生成用户访问令牌,请使用 createUser 该方法创建用户。 创建用户后,使用 getToken 方法为该用户生成令牌,函数将返回该令牌。

在此示例中,您将令牌范围配置为 voip。 你的应用程序可能需要其他功能范围。 若要了解有关范围的详细信息,请参阅 创建和管理访问令牌

module.exports = async function (context, req) {
    let tokenClient = new CommunicationIdentityClient(connectionString);

    const user = await tokenClient.createUser();

    const userToken = await tokenClient.getToken(user, ["voip"]);

    context.res = {
        body: userToken
    };
}

对于现有的通信服务 CommunicationUser 参数,可以跳过创建步骤并生成访问令牌。 有关详细信息,请参阅创建和管理访问令牌

测试函数

使用 F5.. 在本地运行函数。 此操作在本地初始化函数,并使其可通过http://localhost:7071/api/FUNCTION_NAME访问。 有关在本地运行的详细信息,请参阅 快速入门:使用 Visual Studio Code 在 Azure 中创建 C# 函数

在浏览器中打开 URL,会看到包含通信用户 ID、令牌和令牌过期的响应正文。

显示所创建函数的响应示例的屏幕截图。

将函数部署到 Azure

若要部署函数,请按照快速入门中的分步说明作 :使用 Visual Studio Code 在 Azure 中创建 C# 函数

总之,需要:

  1. 从 Visual Studio 登录到 Azure。
  2. 将项目发布到 Azure 帐户。 此处需要选择现有订阅。
  3. 使用 Visual Studio 向导或现有资源创建新的函数资源。 对于新资源,需要将其配置为所需的区域、运行时和唯一标识符。
  4. 等待部署完成。
  5. 运行函数。

运行函数

使用 URL http://<function-appn-ame>.azurewebsites.net/api/<function-name>运行函数。

若要查找 URL,请在 Visual Studio Code 中右键单击该函数并复制函数 URL。

有关如何运行函数的详细信息,请参阅 快速入门:使用 Visual Studio Code 在 Azure 中创建 C# 函数

保护终结点

作为设置一个受信任的服务以为用户提供访问令牌的一部分,您需要考虑该终结点的安全性,以确保没有恶意行为者可以随意为您的服务创建令牌。 Azure Functions 提供内置安全功能,可用于使用不同类型的身份验证策略来保护终结点。 有关详细信息,请参阅 Azure Functions 安全性

清理资源

如果要清理并移除 Azure 通信服务订阅,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。 可以详细了解如何 清理通信服务资源清理 Azure Functions 资源