Xác thực luồng

Genkit hỗ trợ xác thực ở cấp luồng, cho phép bạn bảo mật quy trình của mình và đảm bảo rằng chỉ những người dùng được uỷ quyền mới có thể thực thi quy trình. Điều này đặc biệt hữu ích khi triển khai luồng dưới dạng điểm cuối HTTP.

Định cấu hình xác thực luồng

Để thêm tính năng xác thực vào một luồng, bạn có thể sử dụng tuỳ chọn WithFlowAuth khi xác định luồng. Tuỳ chọn này sẽ triển khai giao diện FlowAuth, cung cấp các phương thức để xử lý việc xác thực và uỷ quyền.

Dưới đây là ví dụ về cách xác định luồng bằng quy trình xác thực:

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

Trong ví dụ này, chúng tôi sử dụng trình bổ trợ xác thực Firebase để xử lý việc xác thực. Hàm policy xác định logic uỷ quyền, kiểm tra xem mã nhận dạng người dùng trong ngữ cảnh xác thực có khớp với mã nhận dạng người dùng đầu vào hay không.

Sử dụng Trình bổ trợ xác thực Firebase

Trình bổ trợ xác thực Firebase giúp bạn dễ dàng tích hợp tính năng Xác thực Firebase với các quy trình của Genkit. Sau đây là cách sử dụng:

  1. Nhập trình bổ trợ Firebase:

    import "github.com/firebase/genkit/go/plugins/firebase"
    
  2. Tạo trình cung cấp dịch vụ xác thực trong Firebase:

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

    Hàm NewAuth nhận 3 đối số:

    • ctx: Ngữ cảnh cho việc khởi chạy Firebase.
    • policy: Một hàm xác định logic uỷ quyền.
    • required: Giá trị boolean cho biết liệu có bắt buộc xác thực đối với cuộc gọi trực tiếp hay không.
  3. Sử dụng trình cung cấp dịch vụ xác thực khi xác định luồng của bạn:

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

Xử lý xác thực trong yêu cầu HTTP

Khi luồng của bạn được triển khai dưới dạng điểm cuối HTTP, trình bổ trợ xác thực Firebase sẽ tự động xử lý việc xác thực cho các yêu cầu đến. Cần có mã thông báo truy cập trong tiêu đề Uỷ quyền của yêu cầu HTTP.

Chạy quy trình xác thực cục bộ

Khi chạy các luồng đã xác thực một cách cục bộ hoặc từ trong các luồng khác, bạn có thể cung cấp ngữ cảnh xác thực cục bộ bằng cách sử dụng tuỳ chọn WithLocalAuth:

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

Nhờ đó, bạn có thể kiểm thử các quy trình đã xác thực mà không cần cung cấp mã thông báo Firebase hợp lệ.