部署函式會透過應用程式認證呼叫外部 Azure 和 Fabric 資源作為應用程式身份。 宣告函數所需的受眾,並透過 ctx.Tokens 使用平台提供、以資源為範圍的權杖。
開發者 CLI 登入與著作時端點發現與部署執行時存取是分開的。 即使開發者能存取資源,也要驗證已部署應用程式身份的權限。
先決條件
- 一個已初始化 Functions 的 Fabric 應用程式。 關於設定說明,請參見「在 Fabric 應用程式中使用函式」。
- 在
rayfin/rayfin.yml中將services.functions.auth.type設定為application。 關於設定細節,請參見 應用程式認證。 - 應用程式身份賦予函式程式碼呼叫的每個外部資源的存取權限。
宣告外部連線
在 RayfinContext 註解中宣告受眾,然後從 ctx.Tokens 讀取範圍限定權杖:
import {
UserDataFunctions,
AudienceType,
type RayfinContext,
} from '@microsoft/fabric-user-data-functions';
const udf = new UserDataFunctions();
udf.func(
'accessStorage',
async (
ctx: RayfinContext<AppSchema, AudienceType.Storage>,
): Promise<string> => {
const token: string = ctx.Tokens.Storage;
// Use the token with the resource SDK or REST API.
return 'ok';
},
[],
);
註解就是宣告。 在 RayfinContext<Schema, Audiences> 中列出受眾會註冊連線繫結。 將 的 udf.func() 第三個參數保持為 []。
ctx.Tokens 被縮小到你所宣稱的受眾。 未申報的受眾會導致編譯錯誤:
async (
ctx: RayfinContext<AppSchema, AudienceType.Sql | AudienceType.Storage>,
) => {
const sqlToken: string = ctx.Tokens.Sql;
const storageToken: string = ctx.Tokens.Storage;
};
代幣值有類型 string 。 宣告受眾登記其綁定,但不保證代幣可用性或資源存取。 如果主機沒有提供已宣告的標記,讀取其 ctx.Tokens 屬性會丟出錯誤。
指定結構描述引數
RayfinContext 會優先採用你的應用程式結構描述。 使用你傳入 RayfinClient<AppSchema> 的同一個架構,這樣資料客戶端在新增受眾時會保持類型不變:
async (ctx: RayfinContext<AppSchema, AudienceType.Sql>) => {
const data = ctx.getDataClient();
const token = ctx.Tokens.Sql;
};
如果函式需要受眾但無法存取 Rayfin 資料庫,請明確傳遞預設架構:
async (ctx: RayfinContext<Record<string, any>, AudienceType.Fabric>) => {
const token = ctx.Tokens.Fabric;
};
支援的對象
AudienceType 是支持受眾的真相來源:
| 外部資源 | AudienceType |
|---|---|
| Fabric 湖屋、倉庫、Fabric 中的 SQL 資料庫、鏡像資料庫,或 Azure SQL Database | Sql |
| Fabric OneLake 檔案、Azure Blob 儲存體、Azure Table 儲存體或 Azure Queue 儲存體 | Storage |
| Microsoft Fabric REST API | Fabric |
| Azure AI Foundry | AzureAI |
| Azure DevOps | ADO |
Power BI 語意模型無法透過 ctx.Tokens 取得。 還是用連接器 fabric-semanticmodel 吧。 如需連接器相關指引,請參閱「連線至 Fabric 資料」。
了解部署元資料
型別參數會在函式執行前被擦除。 在 npx rayfin up期間,TypeScript 編譯器會解析宣告的受眾,並將 union 寫入部署元資料。 函式工作者會利用這些元資料來綁定連線。
當 Functions 專案具有 tsconfig.json 時,型別別名可正常運作:
type SqlAccess = AudienceType.Sql;
async (ctx: RayfinContext<AppSchema, SqlAccess>) => {
const token = ctx.Tokens.Sql;
};
偏好常值 AudienceType.X。 如果 Functions 專案沒有 tsconfig.json,CLI 就無法使用編譯器,而是讀取註解語法。 在該模式下,別名會解析為其本身的名稱,而非它所代表的受眾。 將關於此備用的 CLI 警告視為需要修正的錯誤。
上下文參數必須有明確 RayfinContext<...> 的註解。 型別產生透過此註解識別上下文參數。 若無此參數,該參數將被視為請求體參數。
授予資源權限
對目前的 Fabric 應用程式而言,應用程式身分是 Fabric 應用程式項目的擁有者。 外部連線使用這個身份及其權限,而非呼叫該功能的應用程式使用者的身份或權限。
賦予應用程式身份所有函式程式碼呼叫的資源和 API 所需的權限。 宣告受眾並部署 Functions 會註冊權杖繫結,但不會授與目標資源的權限。
資源代幣留在伺服器上。 切勿將它們以函式結果形式回傳或送往前端。
應用程式登入與授權呼叫功能,與應用程式身份對外部資源的存取是分開的。
Rayfin 資料庫識別碼
Rayfin DB 使用獨立的認證路徑。
ctx.getDataClient() 使用呼叫的 Rayfin 標記,因此資料庫存取會保留呼叫者的身份與資料庫權限。 Functions 的應用程式驗證不會將 Rayfin DB 的存取切換為應用程式身分。
使用 Azure SDK 的 token
許多 Azure SDK 用戶端預期使用的是 TokenCredential,而非原始權杖字串。 定義一個從上下文回傳令牌的適配器:
import type { TokenCredential, AccessToken } from '@azure/identity';
class ContextTokenCredential implements TokenCredential {
constructor(private readonly token: string) {}
async getToken(): Promise<AccessToken> {
return {
token: this.token,
expiresOnTimestamp: Date.now() + 3600_000,
};
}
}
將 new ContextTokenCredential(ctx.Tokens.Storage) 或適當的宣告權杖傳遞給需要憑證的 SDK 用戶端。 請在 rayfin/functions/package.json 安裝資源 SDK 套件,而不是在專案根目錄中安裝。
在地發展
npx rayfin dev並npx rayfin dev functions apply啟動本地的 Azure Functions Core Tools 主機。 在本地的 Functions 主機中,外部資源憑證會使用應用程式建置者登入帳號的身份與權限。
部署函式則改用應用程式識別碼。 因此,成功的本地呼叫並不代表已部署的應用程式身份有權限存取該資源。 在授予應用程式身分識別所需權限後,測試已部署的函式。