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. Вот как его использовать:
Импортируйте плагин Firebase:
import "github.com/firebase/genkit/go/plugins/firebase"
Создайте поставщика аутентификации Firebase:
firebaseAuth, err := firebase.NewAuth(ctx, policy, required)
Функция
NewAuth
принимает три аргумента:-
ctx
: контекст для инициализации Firebase. -
policy
: функция, определяющая вашу логику авторизации. -
required
: логическое значение, указывающее, требуется ли аутентификация для прямых вызовов.
-
Используйте поставщика аутентификации при определении вашего потока:
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.