管理函数机密

使用秘密为你的函数提供敏感配置,比如个人访问令牌和 API 密钥。 绝不要在源代码中硬编码秘密值,也不要将其暴露给前端。 在运行时通过调用 ctx.getSecret() 来读取它们。

先决条件

  • 一个已初始化函数的 Fabric 应用。 关于设置说明,请参见“在 Fabric 应用中使用函数”。
  • 该应用至少使用 npx rayfin up 部署过一次。 rayfin secret set 和 rayfin secret list 以当前活动的已部署项为目标,并在不存在远程端点时失败。
  • 这是函数所需的秘密值。

设置机密

从应用根节点,启用函数功能并设置密钥:

npx rayfin secret set API_KEY

命令提示输入该值并掩盖你的输入。 要更新已有的秘密,请再次执行同样的命令。 新值取代了现有值。

Important

不要在命令中包含秘密值,也不要提交给源码控制。

列出密钥

列出已配置的机密名称:

npx rayfin secret list

该命令显示秘密名称和时间戳,但从不显示秘密值。

从函数中访问秘密

调用 ctx.getSecret('NAME') 以检索当前调用所需的密钥。 当秘密未配置时,方法会返回 undefined ,因此显式处理可选秘密或提供合适的非秘密默认值。

以下函数从GitHub仓库获取文件。 公共仓库不需要个人访问令牌(PAT)。 对于私有仓库,该函数会将 GITHUB_PAT 密钥添加到请求中:

import {
  UserDataFunctions,
  type RayfinContext,
} from '@microsoft/fabric-user-data-functions';

const udf = new UserDataFunctions();

udf.func(
  'getGitHubFile',
  async (
    owner: string,
    repo: string,
    path: string,
    ref: string,
    ctx: RayfinContext,
  ): Promise<string> => {
    const pat = ctx.getSecret('GITHUB_PAT');
    const headers: Record<string, string> = {
      Accept: 'application/vnd.github.raw+json',
      'User-Agent': 'rayfin-app',
    };

    if (pat) {
      headers.Authorization = `Bearer ${pat}`;
    }

    const encodedPath = path
      .split('/')
      .map(encodeURIComponent)
      .join('/');
    const url =
      `https://api.github.com/repos/${encodeURIComponent(owner)}/` +
      `${encodeURIComponent(repo)}/contents/${encodedPath}` +
      `?ref=${encodeURIComponent(ref || 'main')}`;

    const response = await fetch(url, { headers });
    if (!response.ok) {
      throw new Error(`GitHub ${response.status}: ${await response.text()}`);
    }

    return response.text();
  },
  [],
);

空连接数组表示函数没有声明外部资源受众。 PAT是一个秘密代币,而不是平台提供的资源代币。

按环境配置机密信息

在函数运行的环境中提供秘密值:

  • 本地开发:将密钥值添加到 Values 的 rayfin/functions/local.settings.json 部分。 本地函数主机从该文件读取函数环境值。
  • Fabric:在 Fabric 门户中为已部署项配置机密。

在每个环境里使用相同的秘密名称。 例如,先在本地和 Fabric 中配置 GITHUB_PAT,然后在两个环境中都使用 ctx.getSecret('API_KEY') 读取它。

Important

不要将 rayfin/functions/local.settings.json 或任何其他文件中的机密值提交到版本控制中。 在提交的文件中只存储非秘密的示例或占位符。