管理函式密碼

使用秘密來提供敏感的設定,例如個人存取權杖和 API 金鑰,來管理你的函式。 絕不要在原始碼裡硬編碼秘密值,也不要讓它們暴露給前端。 執行時可透過呼叫 ctx.getSecret()來讀取。

先決條件

  • 一個功能已初始化的 Fabric 應用程式。 關於設定說明,請參見「在 Fabric 應用程式中使用函式」。
  • 該應用程式至少曾使用 npx rayfin up 部署過一次。 rayfin secret set 與 rayfin secret list 以目前使用中的已部署項目為目標,且在不存在遠端端點時會失敗。
  • 你的函式所需的秘密值。

設定秘密

從應用程式根開始,啟用功能功能並設定秘密:

npx rayfin secret set API_KEY

指令會提示這個值,並遮蔽你的輸入。 要更新現有的秘密,請再次執行相同的指令。 新值取代了現有值。

重要

不要在指令中加入秘密值,也不要提交給原始碼控制。

列出機密

列出已設定的秘密名稱:

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();
  },
  [],
);

空的 connections 陣列表示該函式並未宣告外部資源受眾。 PAT 是一個秘密,而非平台提供的資源代幣。

依環境設定機密

在函式執行的環境中提供秘密值:

  • 本機開發:在 Values 的 rayfin/functions/local.settings.json 區段中加入密鑰值。 本地函式主機會從此檔案讀取函式環境值。
  • Fabric:在 Fabric 入口網站中為已部署的項目設定機密。

在每個環境裡都使用相同的秘密名稱。 例如,在本地和 Fabric 中設定 GITHUB_PAT,然後在兩個環境中使用 ctx.getSecret('API_KEY') 讀取。

重要

不要將機密值提交到原始碼控制中的 rayfin/functions/local.settings.json 或任何其他檔案。 只在你提交的檔案中儲存非秘密範例或佔位符。