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 集成。以下是使用方法:
导入 Firebase 插件:
import "github.com/firebase/genkit/go/plugins/firebase"
创建 Firebase Auth 提供方:
firebaseAuth, err := firebase.NewAuth(ctx, policy, required)
NewAuth
函数接受三个参数:ctx
:Firebase 初始化的上下文。policy
:用于定义授权逻辑的函数。required
:一个布尔值,指示是否需要对直接调用进行身份验证。
在定义 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 令牌。