Genkit admite la autenticación a nivel del flujo, lo que te permite proteger tus flujos y garantizar que solo los usuarios autorizados puedan ejecutarlos. Esto es particularmente útil cuando se implementan flujos como extremos HTTP.
Cómo configurar la autenticación de flujo
Para agregar autenticación a un flujo, puedes usar la opción WithFlowAuth
cuando definas el flujo. Esta opción toma una implementación de la interfaz FlowAuth
, que proporciona métodos para controlar la autenticación y la autorización.
Este es un ejemplo de cómo definir un flujo con autenticación:
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),
)
En este ejemplo, usamos el complemento de autenticación de Firebase para controlar la autenticación. La función policy
define la lógica de autorización y verifica si el ID de usuario en el contexto de autenticación coincide con el ID de usuario de entrada.
Usa el complemento de autenticación de Firebase
El complemento de autenticación de Firebase proporciona una forma sencilla de integrar Firebase Authentication en tus flujos de Genkit. Aquí te explicamos cómo usarlo:
Importa el complemento de Firebase:
import "github.com/firebase/genkit/go/plugins/firebase"
Crea un proveedor de autenticación de Firebase:
firebaseAuth, err := firebase.NewAuth(ctx, policy, required)
La función
NewAuth
toma tres argumentos:ctx
: El contexto para la inicialización de Firebase.policy
: Es una función que define tu lógica de autorización.required
: Es un valor booleano que indica si se requiere autenticación para las llamadas directas.
Usa el proveedor de autenticación cuando definas el flujo:
genkit.DefineFlow("secureUserFlow", userDataFunc, genkit.WithFlowAuth(firebaseAuth))
Controla la autenticación en las solicitudes HTTP
Cuando tu flujo se implemente como un extremo HTTP, el complemento de autenticación de Firebase controlará automáticamente la autenticación de las solicitudes entrantes. Espera un token del portador en el encabezado de autorización de la solicitud HTTP.
Ejecuta flujos autenticados de forma local
Cuando ejecutas flujos autenticados de forma local o desde otros flujos, puedes proporcionar un contexto de autenticación local mediante la opción WithLocalAuth
:
response, err := authenticatedFlow.Run(ctx, "user123",
genkit.WithLocalAuth(map[string]any{"UID": "user123"}))
Esto te permite probar flujos autenticados sin necesidad de proporcionar un token de Firebase válido.