Autenticação de fluxo

O Genkit oferece suporte à autenticação no nível do fluxo, o que permite proteger seus fluxos e garantir que somente usuários autorizados possam executá-los. Isso é útil principalmente ao implantar fluxos como endpoints HTTP.

Configuração da autenticação de fluxo

Para adicionar a autenticação a um fluxo, use a opção WithFlowAuth ao definir o fluxo. Essa opção usa uma implementação da interface FlowAuth, que fornece métodos para lidar com autenticação e autorização.

Confira um exemplo de como definir um fluxo com autenticação:

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

Neste exemplo, usamos o plug-in de autenticação do Firebase para processar a autenticação. A função policy define a lógica de autorização, verificando se o ID do usuário no contexto de autenticação corresponde ao ID de entrada.

Uso do plug-in do Firebase Auth

Com o plug-in do Firebase Authentication, é fácil integrar o Firebase Authentication aos fluxos do Genkit. Veja como usá-los:

  1. Importe o plug-in do Firebase:

    import "github.com/firebase/genkit/go/plugins/firebase"
    
  2. Crie um provedor de autenticação do Firebase:

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

    A função NewAuth usa três argumentos:

    • ctx: o contexto para inicialização do Firebase.
    • policy: uma função que define sua lógica de autorização.
    • required: um booleano que indica se a autenticação é necessária para chamadas diretas.
  3. Use o provedor de autenticação ao definir seu fluxo:

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

Processamento da autenticação em solicitações HTTP

Quando seu fluxo é implantado como um endpoint HTTP, o plug-in de autenticação do Firebase processa automaticamente a autenticação das solicitações recebidas. Ele espera um token do portador no cabeçalho de autorização da solicitação HTTP.

Execução dos fluxos autenticados localmente

Ao executar fluxos autenticados localmente ou em outros fluxos, é possível fornecer o contexto de autenticação local usando a opção WithLocalAuth:

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

Isso permite testar fluxos autenticados sem precisar fornecer um token válido do Firebase.