All Products
Search
Document Center

Alibaba Cloud Service Mesh:Integrasikan Keycloak dengan ASM untuk single sign-on

Last Updated:Jun 22, 2026

Topik ini menjelaskan cara menggunakan instans Keycloak yang di-host sendiri sebagai penyedia identitas (IdP) untuk mengaktifkan single sign-on bagi aplikasi dalam service mesh Anda. Dengan mengonfigurasi Custom Authorization Service di ASM, Anda dapat menggunakan protokol OIDC untuk mendelegasikan otentikasi dan otorisasi ke Keycloak, sehingga menghilangkan kebutuhan agar setiap aplikasi menerapkan logika keamanannya sendiri. Setelah otorisasi berhasil, permintaan diteruskan ke aplikasi beserta informasi pengguna dari Keycloak.

Prasyarat

Konsep

Konsep

Deskripsi

IdP

Identity provider (IdP) adalah layanan yang membuat, memelihara, dan mengelola identitas pengguna serta menyediakan layanan otentikasi. Misalnya, ketika Anda menggunakan akun Google untuk login ke aplikasi pihak ketiga, Google bertindak sebagai IdP.

OIDC

OpenID Connect (OIDC) adalah protokol otentikasi yang dibangun di atas kerangka OAuth 2.0. Untuk informasi selengkapnya, lihat OpenID Connect.

Scope

Dalam OIDC, scope menentukan atribut pengguna (seperti email dan informasi profil) yang boleh diakses oleh aplikasi. Selama proses otentikasi, IdP dapat meminta pengguna memberikan izin agar aplikasi mengakses scope tertentu dari data penggunanya.

Prosedur

Langkah 1: Deploy aplikasi demo dan Keycloak

  1. Gunakan manifes YAML berikut untuk mendeploy aplikasi httpbin ke namespace default di kluster ACK yang dikelola Anda. Jalankan perintah 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. Gunakan manifes YAML berikut untuk mendeploy aplikasi Keycloak ke namespace default di kluster ACK yang dikelola Anda. Jalankan perintah 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

Langkah 2: Ekspos aplikasi dan Keycloak melalui gateway

Pada contoh ini, Anda mengakses aplikasi demo melalui HTTPS (port 443) dan konsol Keycloak melalui HTTP (port 80).

  1. Buat sertifikat untuk layanan HTTPS dan beri nama myexample-credential. Untuk informasi selengkapnya, lihat Enable Secure HTTPS Services by Using an ASM Ingress Gateway.

  2. Gunakan YAML berikut untuk membuat Gateway dan VirtualService di kluster ASM guna mengekspos Keycloak ke jaringan publik.

    1. Di Konsol ASM, konfigurasikan Gateway untuk instans ASM yang sesuai. Untuk informasi selengkapnya, lihat Manage gateway rules.

      View YAML

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: ingressgateway
        namespace: istio-system
      spec:
        selector:
          app: istio-ingressgateway // Pastikan selector ini sesuai dengan gateway yang sudah ada.
        servers:
          - hosts:
              - '*'
            port:
              name: http-httpbin // Gunakan HTTPS (port 443) untuk mengakses aplikasi contoh.
              number: 443
              protocol: HTTPS
            tls:
              credentialName: myexample-credential
              mode: SIMPLE
          - hosts:
              - '*'
            port:
              name: keycloak // Gunakan HTTP (port 80) untuk mengakses konsol Keycloak.
              number: 80
              protocol: HTTP
                                      
    2. Terapkan VirtualService berikut ke instans ASM. Untuk informasi selengkapnya, lihat 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. Di browser Anda, buka http://${ASM_INGRESS_GATEWAY_ADDRESS} untuk mengakses aplikasi Keycloak.

  4. Klik Administration Console dan login dengan kredensial admin yang Anda konfigurasi saat deployment Keycloak.

Langkah 3: Konfigurasi Keycloak

  1. Di panel navigasi kiri Keycloak, pilih Master dari daftar dropdown lalu klik Create Realm.

  2. Di halaman konfigurasi realm baru, buat client. Di tab General Settings, atur Client type menjadi OpenID Connect dan Client ID menjadi oauth2proxy. Di tab Capability config, aktifkan Client authentication, nonaktifkan Authorization, dan di bagian Authentication flow, centang hanya kotak Standard flow dan Direct access grants.

  3. Buat pengguna di realm tersebut. Atur Username menjadi asm-test dan aktifkan Email verified. Lalu, klik Save.

  4. Di halaman User details, klik tab Credentials.

  5. Atur kata sandi untuk pengguna tersebut. Atur Temporary menjadi Off lalu klik Save.

  6. Buat role realm. Atur Role name menjadi test-role lalu klik Save.

  7. Di halaman User details, pilih tab Role mapping.

  8. Di halaman Role mapping, klik Assign role. Tetapkan role test-role kepada pengguna tersebut.

  9. Buat client scope. Atur Name menjadi test_scope dan Protocol menjadi OpenID Connect. Aktifkan Display on consent screen dan Include in token scope. Lalu, klik Save.

  10. Di halaman Client Scope, klik tab Mappers lalu tambahkan mapper. Atur Mapper type menjadi Audience dan Name menjadi test-mapper. Untuk Included Client Audience, pilih oauth2proxy, dan aktifkan Add to access token. Lalu, klik Save.

  11. Klik tab Scope, centang kotak di samping role test-role, lalu klik Assign.

  12. Di halaman pengaturan client, klik tab Client scopes lalu tambahkan client scope test_scope sebagai default scope.

  13. Tambahkan Valid redirect URIs untuk oauth2-proxy kluster. Di tab Settings, pada bagian Access settings, masukkan https://${ASM ingress gateway address}/oauth2/callback ke dalam bidang Valid redirect URIs lalu klik Save.

Catatan

Pada contoh ini, hanya layanan Keycloak yang menggunakan protokol HTTP. Semua layanan lain menggunakan HTTPS. Oleh karena itu, format redirect URI adalah https://${ASM_INGRESS_GATEWAY_ADDRESS}/oauth2/callback.

Keycloak kini telah dikonfigurasi. Catat informasi berikut:

  • ID realm baru: Test-oidc.

  • Client ID yang dibuat di realm: oauth2proxy.

  • client secret pada subtab Credentials di pengaturan client.

Langkah 4: Aktifkan otorisasi kustom dan SSO OIDC

  1. Login ke ASM console. Di panel navigasi kiri, pilih Service Mesh > Mesh Management.

  2. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih Mesh Security Center > Custom Authorization Service.

  3. Di halaman External Authorization Service, klik Register External Authorization Service dan pilih OIDC Authz and Authn Service. Atur parameter untuk Layanan Otentikasi dan Otorisasi Identitas OIDC lalu klik Create.

    Di panel Associate Custom Authorization Service, pilih OIDC Identity Authentication and Authorization Service sebagai tipe dan konfigurasikan parameternya.

    Masukkan informasi dari client OIDC yang Anda buat di Keycloak. Anda dapat menggunakan ingress gateway ASM sebagai redirect URI untuk login. Untuk informasi lebih lanjut tentang cookie secret, lihat Generating a Cookie Secret.

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

    • ClientID dan Client Secret: Gunakan nilai yang telah Anda catat pada langkah sebelumnya.

    • Scopes: OpenID adalah scope wajib. Anda dapat menentukan scope lainnya.

  4. Buat VirtualService menggunakan YAML berikut.

    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
    Catatan
    • Ganti nilai bidang host di bagian route dengan nama layanan oauth2-proxy di namespace istio-system kluster ACK Anda.

    • Untuk mencegah konflik VirtualService, hindari memiliki VirtualService lain yang mencocokkan path dengan awalan /oauth2.

Langkah 5: Buat kebijakan otorisasi

  1. Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih Mesh Security Center > AuthorizationPolicy.

  2. Di halaman AuthorizationPolicy, klik Create from YAML.

  3. Di halaman Create, pilih Namespaces dan Scenario Template, konfigurasikan manifes YAML berikut, lalu klik 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
    Catatan
    • AuthorizationPolicy ini menentukan bahwa semua permintaan ke port selain port 80 memerlukan otorisasi.

    • Untuk provider.name, masukkan nama layanan otorisasi kustom terkait Anda. Anda dapat menemukan nama ini di daftar pada halaman Custom Authorization Service.

Langkah 6: Verifikasi integrasi

  1. Di browser Anda, buka http://${ASM_INGRESS_GATEWAY_ADDRESS}:80.

    Hasil yang diharapkan: Halaman login OAuth2 Proxy muncul dengan tombol Sign in with OpenID Connect, yang menunjukkan bahwa single sign-on telah diaktifkan.

  2. Klik Sign in with OpenID Connect. Di halaman login Keycloak, masukkan kredensial pengguna uji yang dibuat pada Langkah 3 lalu klik Log In.

    Hasil yang diharapkan: Setelah login, halaman httpbin.org ditampilkan. Halaman tersebut mencakup kategori API seperti HTTP Methods, Auth, Status codes, dan Request Inspection.

  3. Klik Request inspection, lalu pilih /headers > try it out > Execute.

    Hasil yang diharapkan: Di bagian Server response, badan respons berisi informasi header permintaan, termasuk bidang Authorization: Bearer {JWT}. Hal ini menunjukkan bahwa permintaan membawa token JWT yang dikeluarkan oleh Keycloak.

  4. Dekode token JWT dari langkah sebelumnya (string setelah Bearer) menggunakan debugger JWT. Untuk informasi lebih lanjut tentang debugger JWT, lihat JWT debugger.

    Hasil yang diharapkan: Setelah token berhasil didekode, token yang didekode menunjukkan bahwa algoritma di HEADER adalah RS256 dan PAYLOAD berisi klaim seperti realm_access (informasi role), preferred_username (username), dan client_id (oauth2proxy). Hal ini mengonfirmasi bahwa JWT telah diverifikasi oleh ASM dan mencakup informasi pengguna yang disimpan di Keycloak.