흐름 인증

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 함수는 인증 컨텍스트의 사용자 ID가 입력 사용자 ID와 일치하는지 확인하는 승인 로직을 정의합니다.

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 요청의 승인 헤더에 Bearer 토큰이 있어야 합니다.

로컬에서 인증된 흐름 실행

인증된 흐름을 로컬로 또는 다른 흐름 내에서 실행하는 경우 WithLocalAuth 옵션을 사용하여 로컬 인증 컨텍스트를 제공할 수 있습니다.

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

이렇게 하면 유효한 Firebase 토큰을 제공하지 않고도 인증된 흐름을 테스트할 수 있습니다.