Поточная аутентификация

Genkit поддерживает аутентификацию на уровне потока, позволяя вам защитить ваши потоки и гарантировать, что только авторизованные пользователи смогут их выполнять. Это особенно полезно при развертывании потоков в качестве конечных точек HTTP.

Настройка потоковой аутентификации

Чтобы добавить аутентификацию в поток, вы можете использовать параметр WithFlowAuth при определении потока. Этот параметр использует реализацию интерфейса FlowAuth , который предоставляет методы для обработки аутентификации и авторизации.

Вот пример того, как определить поток с аутентификацией:

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 для обработки аутентификации. Функция policy определяет логику авторизации, проверяя, соответствует ли идентификатор пользователя в контексте аутентификации входному идентификатору пользователя.

Использование плагина аутентификации Firebase

Плагин аутентификации Firebase обеспечивает простой способ интеграции аутентификации Firebase с вашими потоками Genkit. Вот как его использовать:

  1. Импортируйте плагин Firebase:

    import "github.com/firebase/genkit/go/plugins/firebase"
    
  2. Создайте поставщика аутентификации Firebase:

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

    Функция NewAuth принимает три аргумента:

    • ctx : контекст для инициализации Firebase.
    • policy : функция, определяющая вашу логику авторизации.
    • required : логическое значение, указывающее, требуется ли аутентификация для прямых вызовов.
  3. Используйте поставщика аутентификации при определении вашего потока:

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

Обработка аутентификации в HTTP-запросах

Когда ваш поток развернут как конечная точка HTTP, плагин аутентификации Firebase будет автоматически обрабатывать аутентификацию для входящих запросов. Он ожидает токен носителя в заголовке авторизации HTTP-запроса.

Запуск аутентифицированных потоков локально

При запуске аутентифицированных потоков локально или из других потоков вы можете предоставить локальный контекст аутентификации с помощью параметра WithLocalAuth :

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

Это позволяет вам тестировать аутентифицированные потоки без необходимости предоставления действующего токена Firebase.