flow 身份验证

Genkit 支持 flow 级身份验证,可让您保护 flow 并确保只有获授权的用户才能执行 flow。将 flow 部署为 HTTP 端点时,此功能尤为有用。

配置 flow 身份验证

如需向 flow 添加身份验证,您可以在定义 flow 时使用 WithFlowAuth 选项。此选项采用 FlowAuth 接口的实现,以提供用于处理身份验证和授权的方法。

下面的示例展示了如何定义包含身份验证的 flow:

ctx := context.Background()
// Define an auth policy and create a Firebase auth provider
firebaseAuth, err := firebase.NewAuth(ctx, func(authContext genkit.AuthContext, input any) error {
	// The type must match the input type of the flow.
	userID := input.(string)
	if authContext == nil || authContext["UID"] != userID {
		return errors.New("user ID does not match")
	}
	return nil
}, true)
if err != nil {
	log.Fatalf("failed to set up Firebase auth: %v", err)
}
// Define a flow with authentication
authenticatedFlow := genkit.DefineFlow(
	"authenticated-flow",
	func(ctx context.Context, userID string) (string, error) {
		return fmt.Sprintf("Secure data for user %s", userID), nil
	},
	genkit.WithFlowAuth(firebaseAuth),
)

在此示例中,我们将使用 Firebase Auth 插件来处理身份验证。policy 函数定义授权逻辑,检查授权上下文中的用户 ID 是否与输入的用户 ID 匹配。

使用 Firebase Auth 插件

Firebase Auth 插件提供了一种轻松的方法,可将 Firebase Authentication 与 Genkit flow 集成。以下是使用方法:

  1. 导入 Firebase 插件:

    import "github.com/firebase/genkit/go/plugins/firebase"
    
  2. 创建 Firebase Auth 提供方:

    firebaseAuth, err := firebase.NewAuth(ctx, policy, required)
    

    NewAuth 函数接受三个参数:

    • ctx:Firebase 初始化的上下文。
    • policy:用于定义授权逻辑的函数。
    • required:一个布尔值,指示是否需要对直接调用进行身份验证。
  3. 在定义 flow 时使用身份验证提供方:

    genkit.DefineFlow("secureUserFlow", userDataFunc, genkit.WithFlowAuth(firebaseAuth))
    

处理 HTTP 请求中的身份验证

将 flow 部署为 HTTP 端点后,Firebase Auth 插件会自动处理传入请求的身份验证。它需要在 HTTP 请求的 Authorization 标头中包含不记名令牌。

在本地运行经过身份验证的 flow

在本地或从其他 flow 中运行经过身份验证的 flow 时,您可以使用 WithLocalAuth 选项提供本地身份验证上下文:

response, err := authenticatedFlow.Run(ctx, "user123",
	genkit.WithLocalAuth(map[string]any{"UID": "user123"}))

这样,您就可以测试经过身份验证的 flow,而无需提供有效的 Firebase 令牌。