Autenticazione del flusso

Genkit supporta l'autenticazione a livello di flusso, consentendoti di proteggere i tuoi flussi e di assicurarti che solo gli utenti autorizzati possano eseguirli. Questa operazione è particolarmente utile quando esegui il deployment dei flussi come endpoint HTTP.

Configurazione dell'autenticazione dei flussi

Per aggiungere l'autenticazione a un flusso, puoi utilizzare l'opzione WithFlowAuth durante la definizione del flusso. Questa opzione accetta un'implementazione dell'interfaccia FlowAuth, che fornisce metodi per gestire l'autenticazione e l'autorizzazione.

Ecco un esempio di come definire un flusso con autenticazione:

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),
)

In questo esempio utilizziamo il plug-in di autenticazione Firebase per gestire l'autenticazione. La funzione policy definisce la logica di autorizzazione, controllando se l'ID utente nel contesto di autenticazione corrisponde all'ID utente inserito.

Utilizzo del plug-in Firebase Auth

Il plug-in Firebase Auth offre un modo semplice per integrare Firebase Authentication con i tuoi flussi Genkit. Ecco come utilizzarlo:

  1. Importa il plug-in Firebase:

    import "github.com/firebase/genkit/go/plugins/firebase"
    
  2. Crea un provider di autenticazione Firebase:

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

    La funzione NewAuth accetta tre argomenti:

    • ctx: il contesto per l'inizializzazione di Firebase.
    • policy: una funzione che definisce la logica di autorizzazione.
    • required: un valore booleano che indica se è richiesta l'autenticazione per le chiamate dirette.
  3. Utilizza il provider di autenticazione quando definisci il flusso:

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

Gestione dell'autenticazione nelle richieste HTTP

Quando il flusso viene implementato come endpoint HTTP, il plug-in di autenticazione Firebase gestisce automaticamente l'autenticazione per le richieste in arrivo. Si aspetta un token Bearer nell'intestazione Authorization della richiesta HTTP.

Eseguire i flussi autenticati in locale

Quando esegui flussi autenticati localmente o all'interno di altri flussi, puoi fornire il contesto di autenticazione locale utilizzando l'opzione WithLocalAuth:

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

In questo modo puoi testare i flussi autenticati senza dover fornire un token Firebase valido.