Todos los productos
Search
Centro de documentos

Alibaba Cloud Service Mesh:Integración de Keycloak con ASM para inicio de sesión único

Última actualización: Sep 21, 2026

Este tema describe cómo usar una instancia de Keycloak autoalojada como proveedor de identidades (IdP) para habilitar el inicio de sesión único en las aplicaciones de su service mesh. Al configurar un Custom Authorization Service en ASM, puede utilizar el protocolo OIDC para delegar la autenticación y la autorización a Keycloak. Esto elimina la necesidad de que cada aplicación implemente su propia lógica de seguridad. Una vez autorizada correctamente la solicitud, se reenvía a la aplicación junto con la información del usuario proveniente de Keycloak.

Requisitos previos

Conceptos

Concepto

Descripción

IdP

Un proveedor de identidades (IdP) es un servicio que crea, mantiene y gestiona las identidades de los usuarios, además de proporcionar servicios de autenticación. Por ejemplo, cuando utiliza una cuenta de Google para iniciar sesión en una aplicación de terceros, Google actúa como el IdP.

OIDC

OpenID Connect (OIDC) es un protocolo de autenticación construido sobre el framework OAuth 2.0. Para obtener más información, consulte OpenID Connect.

Scope

En OIDC, los scopes especifican qué atributos del usuario (como el correo electrónico o la información del perfil) puede acceder una aplicación. Durante la autenticación, el IdP puede solicitar al usuario que otorgue permiso para que la aplicación acceda a scopes específicos de sus datos.

Procedimiento

Paso 1: Desplegar la aplicación de demostración y Keycloak

  1. Utilice el siguiente manifiesto YAML para desplegar la aplicación httpbin en el namespace default de su clúster administrado de ACK. Ejecute el comando kubectl apply -n default -f xxx.yaml.

    View YAML

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          serviceAccountName: httpbin
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
  2. Utilice el siguiente manifiesto YAML para desplegar la aplicación Keycloak en el namespace default de su clúster administrado de ACK. Ejecute el comando kubectl apply -n default -f xxx.yaml.

    View YAML

    apiVersion: v1
    kind: Service
    metadata:
      name: keycloak
      labels:
        app: keycloak
    spec:
      ports:
      - name: http
        port: 8080
        targetPort: 8080
      selector:
        app: keycloak
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: keycloak
      labels:
        app: keycloak
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: keycloak
      template:
        metadata:
          labels:
            app: keycloak
        spec:
          containers:
          - name: keycloak
            image: quay.io/keycloak/keycloak:latest
            args: ["start-dev"]
            env:
            - name: KEYCLOAK_ADMIN
              value: "admin"
            - name: KEYCLOAK_ADMIN_PASSWORD
              value: "admin"
            - name: KC_PROXY
              value: "edge"
            ports:
            - name: http
              containerPort: 8080
            readinessProbe:
              httpGet:
                path: /realms/master
                port: 8080

Paso 2: Exponer la aplicación y Keycloak mediante una puerta de enlace

En este ejemplo, se accede a la aplicación de demostración mediante HTTPS (puerto 443) y a la consola de Keycloak mediante HTTP (puerto 80).

  1. Cree un certificado para el servicio HTTPS y asígnele el nombre myexample-credential. Para obtener más información, consulte Enable Secure HTTPS Services by Using an ASM Ingress Gateway.

  2. Utilice el siguiente YAML para crear un Gateway y un VirtualService en el clúster de ASM, con el fin de exponer Keycloak a la red pública.

    1. En la consola de ASM, configure el Gateway para la instancia de ASM correspondiente. Para obtener más información, consulte Manage gateway rules.

      View YAML

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        selector:
          app: istio-ingressgateway // Make sure that this selector matches the existing gateway.
        servers:
          - hosts:
              - '*'
            port:
              name: http-httpbin // Use HTTPS (port 443) to access the sample application.
              number: 443
              protocol: HTTPS
            tls:
              credentialName: myexample-credential
              mode: SIMPLE
          - hosts:
              - '*'
            port:
              name: keycloak // Use HTTP (port 80) to access the Keycloak console.
              number: 80
              protocol: HTTP
                                      
    2. Aplique el siguiente VirtualService a la instancia de ASM. Para obtener más información, consulte Manage virtual services.

      View YAML

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: ingressgateway-vs
        namespace: istio-system
      spec:
        gateways:
          - ingressgateway
        hosts:
          - '*'
        http:
          - match:
              - port: 80
            name: keycloak
            route:
              - destination:
                  host: keycloak.default.svc.cluster.local
                  port:
                    number: 8080
          - name: httpbin
            route:
              - destination:
                  host: httpbin.default.svc.cluster.local
                  port:
                    number: 8000
  3. En su navegador, vaya a http://${ASM_INGRESS_GATEWAY_ADDRESS} para acceder a la aplicación Keycloak.

  4. Haga clic en Administration Console e inicie sesión con las credenciales de administrador que configuró durante el despliegue de Keycloak.

Paso 3: Configurar Keycloak

  1. En el panel de navegación izquierdo de Keycloak, seleccione Master en la lista desplegable y haga clic en Create Realm.

  2. En la página de configuración del nuevo realm, cree un cliente. En la pestaña General Settings, establezca Client type en OpenID Connect y Client ID en oauth2proxy. En la pestaña Capability config, habilite Client authentication, deshabilite Authorization y, en la sección Authentication flow, seleccione únicamente las casillas Standard flow y Direct access grants.

  3. Cree un usuario en el realm. Establezca Username en asm-test y habilite Email verified. A continuación, haga clic en Save.

  4. En la página User details, haga clic en la pestaña Credentials.

  5. Establezca una contraseña para el usuario. Configure Temporary en Off y haga clic en Save.

  6. Cree un rol de realm. Establezca Role name en test-role y haga clic en Save.

  7. En la página User details, seleccione la pestaña Role mapping.

  8. En la página Role mapping, haga clic en Assign role. Asigne el rol test-role al usuario.

  9. Cree un client scope. Establezca Name en test_scope y Protocol en OpenID Connect. Habilite Display on consent screen y Include in token scope. Luego, haga clic en Save.

  10. En la página Client Scope, haga clic en la pestaña Mappers y agregue un mapper. Establezca Mapper type en Audience y Name en test-mapper. Para Included Client Audience, seleccione oauth2proxy y habilite Add to access token. Después, haga clic en Save.

  11. Haga clic en la pestaña Scope, seleccione la casilla junto al rol test-role y luego haga clic en Assign.

  12. En la página de configuración del cliente, haga clic en la pestaña Client scopes y agregue el client scope test_scope como scope predeterminado.

  13. Agregue las Valid redirect URIs para oauth2-proxy del clúster. En la pestaña Settings, dentro de la sección Access settings, introduzca https://${ASM ingress gateway address}/oauth2/callback en el campo Valid redirect URIs y haga clic en Save.

Nota

En este ejemplo, solo el servicio Keycloak utiliza el protocolo HTTP. Todos los demás servicios usan HTTPS. Por lo tanto, el formato de la redirect URI es https://${ASM_INGRESS_GATEWAY_ADDRESS}/oauth2/callback.

Keycloak ya está configurado. Registre la siguiente información:

  • El ID del nuevo realm: Test-oidc.

  • El ID de cliente creado en el realm: oauth2proxy.

  • El client secret ubicado en la subpestaña Credentials de la configuración del cliente.

Paso 4: Habilitar la autorización personalizada y el SSO con OIDC

  1. Inicie sesión en la consola de ASM. En el panel de navegación izquierdo, elija Service Mesh > Mesh Management.

  2. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, elija Mesh Security Center > External Authorization Service.

  3. En la página External Authorization Service, haga clic en Register External Authorization Service y seleccione OIDC Authz and Authn Service. Configure los parámetros del OIDC Identity Authentication and Authorization Service y haga clic en Create.

    En el panel Associate Custom Authorization Service, seleccione OIDC Identity Authentication and Authorization Service como tipo y configure los parámetros.

    Introduzca la información del cliente OIDC que creó en Keycloak. Puede usar la puerta de enlace de ingreso de ASM como redirect URI para el inicio de sesión. Para obtener más información sobre el secreto de la cookie, consulte Generating a Cookie Secret.

    • IdP OIDC Issuer URL: http://${ASM_INGRESS_GATEWAY_ADDRESS}/realms/${REALM_NAME_IN_KEYCLOAK}.

    • ClientID y Client Secret: utilice los valores que registró en el paso anterior.

    • Scopes: OpenID es un scope obligatorio. También puede especificar otros scopes.

  4. Cree un VirtualService con el siguiente YAML.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: oauth2-vs
      namespace: istio-system
    spec:
      gateways:
        - ingressgateway
      hosts:
        - '*'
      http:
        - match:
            - uri:
                prefix: /oauth2
          name: oauth2
          route:
            - destination:
                host: asm-oauth2proxy-httpextauth-oidc.istio-system.svc.cluster.local
                port:
                  number: 4180
    Nota
    • Reemplace el valor del campo host en la sección route por el nombre del servicio de oauth2-proxy en el namespace istio-system de su clúster de ACK.

    • Para evitar conflictos entre VirtualServices, asegúrese de que ningún otro VirtualService coincida con rutas que tengan el prefijo /oauth2.

Paso 5: Crear una política de autorización

  1. En la página Mesh Management, haga clic en el nombre de la instancia de ASM. En el panel de navegación izquierdo, elija Mesh Security Center > AuthorizationPolicy.

  2. En la página AuthorizationPolicy, haga clic en Create from YAML.

  3. En la página Create, seleccione un elemento en Namespaces y una plantilla en Scenario Template, configure el siguiente manifiesto YAML y haga clic en Create.

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: oidc
      namespace: istio-system
    spec:
      action: CUSTOM
      provider:
        name: httpextauth-oidc
      rules:
        - to:
            - operation:
                notPorts:
                  - '80'
      selector:
        matchLabels:
          istio: ingressgateway
    Nota
    • Esta AuthorizationPolicy indica que todas las solicitudes dirigidas a puertos distintos del 80 requieren autorización.

    • En provider.name, introduzca el nombre de su servicio de autorización personalizado asociado. Este nombre se encuentra en la lista de la página Custom Authorization Service.

Paso 6: Comprobar la integración

  1. En su navegador, vaya a http://${ASM_INGRESS_GATEWAY_ADDRESS}:80.

    Resultado esperado: aparece la página de inicio de sesión de OAuth2 Proxy con el botón Sign in with OpenID Connect, lo cual indica que el inicio de sesión único está habilitado.

  2. Haga clic en Sign in with OpenID Connect. En la página de inicio de sesión de Keycloak, introduzca las credenciales del usuario de prueba creado en el paso 3 y haga clic en Log In.

    Resultado esperado: tras iniciar sesión, se muestra la página de httpbin.org, que incluye categorías de API como HTTP Methods, Auth, Status codes y Request Inspection.

  3. Haga clic en Request inspection y luego seleccione /headers > try it out > Execute.

    Resultado esperado: en la sección Server response, el cuerpo de la respuesta contiene la información de los encabezados de la solicitud, incluido el campo Authorization: Bearer {JWT}. Esto indica que la solicitud lleva el token JWT emitido por Keycloak.

  4. Decodifique el token JWT del paso anterior (la cadena que sigue a Bearer) mediante un depurador de JWT. Para obtener más información sobre estos depuradores, consulte JWT debugger.

    Resultado esperado: una vez decodificado correctamente el token, se observa que el algoritmo en HEADER es RS256 y que PAYLOAD contiene claims como realm_access (información del rol), preferred_username (nombre de usuario) y client_id (oauth2proxy). Esto confirma que ASM verificó el JWT y que este incluye la información del usuario almacenada en Keycloak.