Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Develop a gRPC-based custom authorization service

Dernière mise à jour :Aug 11, 2026

Service Mesh (ASM) prend en charge les services d'autorisation personnalisés basés sur les protocoles HTTP et gRPC. Un service d'autorisation basé sur gRPC reçoit un message gRPC CheckRequest d'Envoy, inspecte les attributs de la requête et renvoie une décision d'autorisation ou de refus. Ce guide vous explique comment implémenter un tel service et l'enregistrer auprès d'ASM.

Pour consulter l'architecture globale des services d'autorisation personnalisés, reportez-vous à la rubrique Développer un service d'autorisation personnalisé basé sur HTTP.

Contrairement à un service d'autorisation personnalisé basé sur HTTP, un service basé sur gRPC ne nécessite aucune configuration liée aux en-têtes. Tous les en-têtes de requête sont intégrés directement dans le message gRPC CheckRequest envoyé par Envoy.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Un cluster Container Service for Kubernetes (ACK) en cours d'exécution et connecté à ASM

  • Un environnement de développement Go configuré localement

  • Une connaissance de l'API d'autorisation externe d'Envoy

Implémenter le serveur d'autorisation

ASM est compatible avec Istio open source. Istio fournit une implémentation de référence qui couvre à la fois l'autorisation personnalisée HTTP et gRPC. La logique spécifique à gRPC réside dans la structure 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)

Cette structure implémente l'interface Envoy AuthorizationServer, qui requiert une seule méthode :

type AuthorizationServer interface {
    // Performs authorization check based on the attributes associated with the
    // incoming request, and returns status `OK` or not `OK`.
    Check(context.Context, *CheckRequest) (*CheckResponse, error)
}

Logique d'autorisation principale

La méthode Check extrait les attributs de la requête, les évalue et renvoie une réponse d'autorisation ou de refus :

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

    // Determine whether to allow or deny the request.
    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
}

La décision suit deux voies possibles :

  1. Vérification basée sur les en-têtes : si la requête contient l'en-tête checkHeader, le service compare sa valeur à allowedValue. Une correspondance accorde l'accès.

  2. Solution de secours basée sur l'identité : si l'en-tête est absent, le service vérifie si l'identité source (attrs.Source.Principal) se termine par /sa/<serviceAccount>. Cela autorise les requêtes provenant d'un compte de service Kubernetes spécifique.

Référence des champs CheckRequest

Pour obtenir la liste complète des champs dans authv3.CheckRequest, consultez les ressources suivantes :

Version de l'API

Envoy a déprécié les API v2. Implémentez uniquement l'API gRPC v3, comme indiqué dans la signature de la méthode Check ci-dessus.

Enregistrer et appliquer le service d'autorisation

Après avoir déployé le service d'autorisation dans votre cluster ACK :

  1. Accédez à la console ASM et ouvrez la page Define Custom Authorization Service.

  2. Enregistrez le service d'autorisation basé sur gRPC.

  3. Créez une politique d'autorisation qui spécifie quel proxy du maillage utilise le service d'autorisation.

Pour obtenir des instructions détaillées, reportez-vous à la section Implémenter une autorisation personnalisée à l'aide du protocole gRPC.

Étapes suivantes