All Products
Search
Document Center

Alibaba Cloud Service Mesh:Mengembangkan layanan otorisasi kustom berbasis gRPC

Last Updated:Mar 12, 2026

Service Mesh (ASM) mendukung layanan otorisasi kustom berbasis protokol HTTP dan gRPC. Layanan otorisasi berbasis gRPC menerima pesan CheckRequest gRPC dari Envoy, memeriksa atribut permintaan, dan mengembalikan keputusan allow atau deny. Panduan ini memandu Anda melalui implementasi layanan tersebut dan pendaftarannya ke ASM.

Untuk arsitektur keseluruhan layanan otorisasi kustom, lihat Mengembangkan layanan otorisasi kustom berbasis HTTP.

Berbeda dengan layanan otorisasi kustom berbasis HTTP, layanan berbasis gRPC tidak memiliki konfigurasi terkait header. Semua header permintaan langsung disematkan dalam pesan CheckRequest gRPC dari Envoy.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Kluster Container Service for Kubernetes (ACK) yang sedang berjalan dan terhubung ke ASM

  • Lingkungan pengembangan Go yang telah dikonfigurasi di lokal

  • Pemahaman tentang API otorisasi eksternal Envoy

Implementasikan server otorisasi

ASM kompatibel dengan Istio open-source. Istio menyediakan implementasi referensi yang mencakup otorisasi kustom berbasis HTTP maupun gRPC. Logika khusus gRPC berada dalam struktur extAuthzServerV3:

type extAuthzServerV3 struct{}
func (s *extAuthzServerV3) Check(_ context.Context, request *authv3.CheckRequest) (*authv3.CheckResponse, error)
func (s *extAuthzServerV3) allow(request *authv3.CheckRequest) *authv3.CheckResponse
func (s *extAuthzServerV3) deny(request *authv3.CheckRequest) *authv3.CheckResponse
func (s *extAuthzServerV3) logRequest(allow string, request *authv3.CheckRequest)

Struktur ini mengimplementasikan antarmuka AuthorizationServer Envoy, yang hanya memerlukan satu metode:

type AuthorizationServer interface {
    // Melakukan pemeriksaan otorisasi berdasarkan atribut yang terkait dengan
    // permintaan masuk, dan mengembalikan status `OK` atau bukan `OK`.
    Check(context.Context, *CheckRequest) (*CheckResponse, error)
}

Logika otorisasi inti

Metode Check mengekstraksi atribut permintaan, mengevaluasinya, dan mengembalikan respons allow atau deny:

// Check mengimplementasikan permintaan pemeriksaan gRPC v3.
func (s *extAuthzServerV3) Check(_ context.Context, request *authv3.CheckRequest) (*authv3.CheckResponse, error) {
    attrs := request.GetAttributes()

    // Menentukan apakah permintaan diizinkan atau ditolak.
    allow := false
    checkHeaderValue, contains := attrs.GetRequest().GetHttp().GetHeaders()[checkHeader]
    if contains {
        allow = checkHeaderValue == allowedValue
    } else {
        allow = attrs.Source != nil && strings.HasSuffix(attrs.Source.Principal, "/sa/"+*serviceAccount)
    }

    if allow {
        return s.allow(request), nil
    }

    return s.deny(request), nil
}

Keputusan mengikuti dua jalur:

  1. Pemeriksaan berbasis header — Jika permintaan berisi header checkHeader, layanan membandingkan nilainya dengan allowedValue. Kecocokan memberikan akses.

  2. Fallback berbasis identitas — Jika header tidak ada, layanan memeriksa apakah identitas sumber (attrs.Source.Principal) diakhiri dengan /sa/<serviceAccount>. Hal ini mengizinkan permintaan dari akun layanan Kubernetes tertentu.

Referensi bidang CheckRequest

Untuk daftar lengkap bidang dalam authv3.CheckRequest, lihat:

Versi API

Envoy telah menghentikan API v2. Implementasikan hanya API gRPC v3 seperti yang ditunjukkan pada signature metode Check di atas.

Daftarkan dan terapkan layanan otorisasi

Setelah Anda men-deploy layanan otorisasi ke kluster ACK Anda:

  1. Buka Konsol ASM dan buka halaman Define Custom Authorization Service.

  2. Daftarkan layanan otorisasi berbasis gRPC.

  3. Buat kebijakan otorisasi yang menentukan proxy mesh mana yang menggunakan layanan otorisasi tersebut.

Untuk langkah-langkah detail, lihat Menerapkan otorisasi kustom menggunakan protokol gRPC.

Langkah berikutnya